【问题标题】:LIKE clause is not working in SQL serverLIKE 子句在 SQL Server 中不起作用
【发布时间】:2011-04-05 21:37:24
【问题描述】:

我在 SQL Server 2005 中有一个包含以下列的表:

DocID   NSN  QTY
-----------------
DHA12    32    5
DSRB23   22   45
TF22     70   23

每当我执行以下查询以获取所有具有以 DSRB 或 DHA 开头的 DocId 的 NSN 时,它都会给我一个空集:

SELECT  DocId, NSN, Qty, RequestDate, ReceiveDate
  FROM  Orders 
 WHERE (DocID LIKE '%DSRB%') 
   AND (DocID LIKE '%DHA%')  

我猜是有两个 LIKE 子句的问题,因为当我删除最后一个 LIKE 子句时,查询工作正常。

【问题讨论】:

  • 如果您想搜索以 char 字符串开始的内容,您应该使用LIKE 'DHA%' - 在这种情况下,SQL Server 有机会使用索引可能存在,以加快速度。如果您使用您现在拥有的表达式 (LIKE '%DHA%'),您将在字符串中的任何位置搜索包含这三个字母的内容,并且 SQL Server 根本没有机会使用任何索引 - 即使它存在。

标签: sql sql-server sql-server-2005 sql-like


【解决方案1】:

您得到一个空结果,因为您的表中没有一行 DocID 同时类似于 both %DSRB% %DHA%。你没有在你的问题中说,但我猜你希望收到两行 DocIds DHA12DSRB23

为此,您需要选择DocID 类似于either %DSRB% %DHA% 的行。尝试将WHERE 子句中的AND 更改为OR

SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
FROM Orders
WHERE (DocID LIKE '%DSRB%') OR (DocID LIKE '%DHA%')

如果您想了解更多示例,请参阅此introduction to SQL Logical Operators

【讨论】:

    【解决方案2】:

    如果要查找包含 XX YY的行,则需要使用OR

    SELECT DocId, NSN, Qty, RequestDate, ReceiveDate 
    FROM Orders 
    WHERE (DocID LIKE '%DSRB%')
       OR (DocID LIKE '%DHA%')
    

    【讨论】:

      【解决方案3】:

      你不想要一个OR而不是AND吗?

      【讨论】:

        【解决方案4】:

        您的表中没有包含字符串“DSRB”且包含字符串“DHA”的行。

        【讨论】:

          【解决方案5】:

          将其设为“或”而不是“与”。此时,您是说“WHERE”中的两个子句都必须为真。

          【讨论】:

            【解决方案6】:

            您确定需要 AND 吗?您没有显示符合这些要求的记录。我想你可能想要 OR,它应该返回两条记录。

            【讨论】:

              【解决方案7】:

              您的夹层 LIKE 是表扫描,因此性能同样差(或更差)的替代方法是

              SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
              FROM Orders
              WHERE REPLACE(REPLACE(DocID, 'DSRB', ''), 'DHA', '') != DocID
              

              【讨论】:

                【解决方案8】:

                这个:

                SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
                FROM Orders
                WHERE (DocID LIKE '%DSRB%') AND (DocID LIKE '%DHA%')
                

                只会匹配“DSRB DHA”之类的内容

                你的意思是:

                SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
                FROM Orders
                WHERE (DocID LIKE '%DSRB%') OR (DocID LIKE '%DHA%')
                

                或者这个:

                SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
                FROM Orders
                WHERE (DocID LIKE '%DSRB%')
                UNION
                SELECT DocId, NSN, Qty, RequestDate, ReceiveDate
                FROM Orders
                WHERE (DocID LIKE '%DHA%')
                

                【讨论】:

                  猜你喜欢
                  • 2010-10-14
                  • 1970-01-01
                  • 2011-03-21
                  • 1970-01-01
                  • 2012-03-25
                  • 2012-11-15
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多