MS Access很长并且“表达太长”错误

时间:2011-12-09 08:49:05

标签: sql ms-access

我有一个大约有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>
           );

有关如何解决此问题的任何想法或建议?

2 个答案:

答案 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来自我),但我担心你的代码指向一些设计问题。你想用这个代码做什么:找到一切?验证输入?根据用户选择查找?