我在访问中有一个查询,它似乎只能与*通配符一起使用,而不能与#通配符一起使用。

因此,我想排除[Field1]中T [5位数]的所有记录。之前,我只是使用T *,我在访问中创建了一个名为Query的查询,并将其放入SQL设计中

查询1

Select [Field1], [Field2], [Table2].[Field3] from [Table1]
LEFT JOIN [Table1] ON [Table1].[Field1] = [Table2].[Field1]
where [Field1] NOT LIKE "T*"


Java代码

try(PreparedStatement s = conn.prepareStatement("Select [Field1], [Field2], [Field3] from [Query1] where [Field2]
BETWEEN ? AND ?")){
s.setDate(1,java.sql.Date.valueOf(df.getValue()));
s.setDate(2,java.sql.Date.valueOf(dfEnd.getValue()));
try(ResultSet rs = s.executeQuery()){ .... etc etc}


这项工作正常。

但是现在,我需要更具体一点,并用T #####排除field1数据

因此,我尝试更改保存在Access中的查询,如下所示:

查询1:

Select [Field1], [Field2], [Table2].[Field3] from [Table1]
LEFT JOIN [Table1] ON [Table1].[Field1] = [Table2].[Field1]
where [Field1] NOT LIKE "T#####"


在Access中,这很好地拉出了一个查询,从我所看到的来看,Access中没有任何问题。

但是,如果我在Java中使用相同的代码进行复制和粘贴,则会收到此错误:


  UCAExc ::: 4.0.2用户缺少特权或找不到对象:QUERY1


我尝试了压缩和修复,同样的错误。我将T #####改回T *,错误消失了。

所以...我试图通过直接访问表来解决它,所以在Java中,我使用了

Java代码:

 Select [Field1], [Field2], [Table2].[Field3] from [Table1]
LEFT JOIN [Table1] ON [Table1].[Field1] = [Table2].[Field1]
where [Field1] NOT LIKE \"T####\" AND [Field2] BETWEEN ? AND ?")){
s.setDate(1,java.sql.Date.valueOf(df.getValue()));
s.setDate(2,java.sql.Date.valueOf(dfEnd.getValue()));
try(ResultSet rs = s.executeQuery()){ .... etc etc}


而这次,我得到了


  UCAExc ::: 4.0.2意外令牌:需要REGEXP_MATCHES:


我不确定从这里去哪里。我的问题是为什么它不接受##这是UCanAccess问题? Java问题?权限问题?有解决方法吗?

最佳答案

我能够重现您的问题。在UCanAccess 4.0.2下,它可以工作:



SELECT * FROM Table1 WHERE Field1 LIKE "T#####"


但这失败了:

SELECT * FROM Table1 WHERE Field1 NOT LIKE "T#####"


但是,这种解决方法似乎还可以:

SELECT * FROM Table1 WHERE NOT (Field1 LIKE "T#####")

关于java - 具有数字通配符的UCanAccess Select语句提供意外 token :必需REGEXP_MATCHES,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45465750/

10-12 03:51
查看更多