【问题标题】:Using the SQL LIKE operator with %%将 SQL LIKE 运算符与 %% 一起使用
【发布时间】:2009-09-25 11:17:36
【问题描述】:

我需要在 SQL Server 中创建一个查询,其中搜索条件将根据用户输入包含/排除一个表。

假设我有两个表,TABLE_ATABLE_BTABLE_A 中的列 KEYCOLUMN_ACOLUMN_ATABLE_B 中的列 FKCOLUMN_BCOLUMN_B

还有这样的查询:

SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%'

现在如果用户不输入SEARCH2,我不需要搜索TABLE_B。但这意味着IF ELSE 子句。并且随着查询中“可选”表数量的增加,排列组合也会增加,会有很多IFELSE语句。

相反,我决定保持原样。因此,如果SEARCH2 为空,则查询实际上将变为:

SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '% %'

SQL 优化器能否识别LIKE %% 与删除条件本身一样好?

【问题讨论】:

  • 第二个代码示例中有错字。 % 和 % 之间不应有任何空格。 SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_BAND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%%'
  • 像其他人一样使用“sql-server”标签...
  • @devanalyst:你不能编辑问题来修正错字吗?

标签: sql-server pattern-matching sql-like


【解决方案1】:

OR 包裹在您的“B”表周围,例如:

AND (len(searchString)=0 OR table_b.column_b LIKE "%searchString%" )

这样,如果字符串没有值,它的长度将为零,并且 OR 的第一部分将被评估,总是返回为真并将方程的该部分返回为有效并忽略其他部分一半使用LIKE 子句。

您可以根据需要对任意数量的链接表应用相同的方法。

【讨论】:

  • searchString'' ?
【解决方案2】:

首先,您的示例中有一个空格:

AND TABLE_B.COLUMN_B LIKE '% %'

这永远不会被优化,因为它确实是一个重要的条件。

现在,我认为是否对其进行优化取决于数据库引擎及其智能程度。

例如,SQL Server 2005 确实为两种类型的查询提供了相同的执行计划,而 MySQL 5.0.38 则没有。

【讨论】:

  • 第二个代码示例中有错字。 % 和 % 之间不应有任何空格。 SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_BAND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%%
【解决方案3】:

LIKE 与 WHERE 子句一起使用,以使用通配符搜索、更新和删除记录。

例子:

要搜索员工姓名以字符“a”为星号的所有记录:

select * from Employee where Name like 'a%'

要更新名称为 amit 且员工姓名以字符“a”开头的所有记录:

update Employee set Name='amit' where Name like 'a%'

删除员工姓名以字符“a”开头的所有记录:

delete from Employee  where Name like 'a%'

【讨论】:

    【解决方案4】:

    LIKE 运算符用于 WHERE 子句中以搜索列中的指定模式

    LIKE '%[p-s]'  -- "It search data from table parameter where sentence ending with p,q,r,s word."
    LIKE '[0-9]' --It use for search only numeric value
    LIKE '%table%' -- it use for search parameter from table where use "table" keyword'.
    LIKE %[^p-r]  -- it set the condition where Not Ending With a Range of Characters
    
    Example: 
    SELECT T1.BrandName,T1.BrandID,T2.CategoryName,T2.Color FROM TABLE1 T1 
            LEFT JOIN TABLE2 T2 on T1.ID  = T2.BrandID
            WHERE T1.BrandName LIKE '%Samsung%'
    Example: 
    SELECT T1.BrandName,T1.BrandID,T2.CategoryName,T2.Color FROM TABLE1 T1 
            LEFT JOIN TABLE2 T2 on T1.ID  = T2.BrandID
            WHERE T1.BrandName LIKE '%[a-j]'
    

    【讨论】:

      【解决方案5】:

      MySQL中也可以使用ILIKE,然后不区分大小写。

      【讨论】:

      • 这如何回答这个问题?
      【解决方案6】:

      你可以像这样重写你的查询:

      SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
      AND (@paramA='' or TABLE_A.COLUMN_A LIKE '%' + @paramA + '%')
      AND (@paramB='' or TABLE_B.COLUMN_B LIKE '%' + @paramB + '%')
      

      这样,如果 paramA 或 paramB 为 '',则在相同括号内查询的另一列将不会被查询。

      【讨论】:

      • 我认为你的意思正好相反。我检查了上面的代码,它在条件为@paramA = '' 时有效,这实际上是 DRapp 的代码正在做的事情
      【解决方案7】:

      使用 UNION 和正确的 JOIN。

      如果不添加 OR 和 LEN,%foo% 搜索词就够糟糕了(不能使用索引)。

      SELECT
          TABLE_A.*
      FROM
          TABLE_A
          JOIN
          TABLE_B On TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
      WHERE
          TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%'
      UNION
      SELECT
          TABLE_A.*
      FROM
          TABLE_A
      WHERE
          TABLE_A.COLUMN_A LIKE '%SEARCH%'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-01
        • 2023-02-24
        • 1970-01-01
        • 2013-04-29
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 2014-06-24
        相关资源
        最近更新 更多