我有一个大约有50个“OR”条件的SQL,并且所有的SQL都有“Like”运算符。我从VB Access代码执行此SQL。
但是查询失败了,“Expression Too Long”错误(大多数情况下我认为,因为它在查询网格中超过1024个字符。
SELECT *
FROM <My Database>
WHERE (
[Title] = ''
OR [Title] = ''
OR [Title] = ''
OR [Title] = ''
OR [Title] = ''
OR [Title] = ''
OR [Title] = ''
OR [Title] = ''
OR [Title] = ''
OR [Title] = ''
)
AND (
[TITLE] LIKE '*Afghanistan*'
OR [TITLE] LIKE '*Term1*'
OR [TITLE] LIKE '*Term2*'
OR [TITLE] LIKE '*Term3*'
OR ..<around 40 like these>
OR [COUNTRY] LIKE '*Country1*'
OR ...<around 40 like these>
);
有关如何解决此问题的任何想法或建议?
答案 0 :(得分:4)
建议:将参数值插入基本“staging”表(可能在另一个临时数据库中),并使用EXISTS
创建这些表的seni连接。使用ALIKE
(而非LIKE
),它始终使用标准SQL通配符(%
)。
SELECT *
FROM MyTable AS m
WHERE EXISTS (
SELECT *
FROM MyExactParams AS x
WHERE m.Title = x.Title
)
AND (
EXISTS (
SELECT *
FROM MyPatternParams AS p
WHERE m.Title ALIKE '%' + p.Title + '%'
)
OR EXISTS (
SELECT *
FROM MyPatternCountries AS c
WHERE m.Country ALIKE '%' + c.Country + '%'
)
);
答案 1 :(得分:0)
首先感谢您将此作为单独的问题发布到your previous one。这是正确的方法: - )
重复OR [Title] = ''
的东西应该去,它们只是混乱,你只需要其中一个,假设你真的需要匹配一个空标题。
其次,你真的需要通配符吗?如果数据库设计得很好,那么名为Country
的字段应该只包含国家/地区的名称,因此您只需说[Country]='Afghanistan'
。
如果您不需要通配符,则IN
关键字会变得有用:您可以使用[Country] IN ('Afghanistan', 'Term1', 'Term2', 'Term3')
检查多个选项
onedaywhen的建议非常好(+1来自我),但我担心你的代码指向一些设计问题。你想用这个代码做什么:找到一切?验证输入?根据用户选择查找?