是否有另一种写LIKE查询的样式?

时间:2011-09-23 00:17:14

标签: sql sql-server tsql sql-server-2008

我写了一些像这样的查询:

SELECT *
FROM Sample.dbo.Temp
WHERE
   Name LIKE '%ab%'
OR Name LIKE '%fg%'
OR NAME LIKE '%asd%'
OR ...
OR ...
OR Name LIKE '%kj%'

无论如何我可以像这样重写这个查询:

SELECT *
FROM Sample.dbo.Temp
WHERE
   Name LIKE (
             '%ab%'  
          OR '%fg%'
          OR '%asd%'
          OR ...
          OR ...
          OR '%kj%'
              )

从可读性的角度和可管理性来看,看起来更舒服。如果列Name发生更改,我可以始终进行一次更改而不是一次更改(或使用Find and Replace)。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

不,你必须不断重复LIKE

虽然你可能会愚弄它以使其工作类似,但它不会更漂亮或更具可读性。

也许你应该以编程方式生成查询而不是手动编写它?

PS:或许全文索引在这里更好看?

答案 1 :(得分:2)

您可以将值放在表格中,可能是CTE和半连接到您的表格,例如

WITH params 
     AS 
     (
      SELECT * 
        FROM (
              VALUES ('at'),
                     ('fg'),
                     ('asd'),
                     ('kj')
             ) AS T (param)
     )
SELECT *
  FROM Sample.dbo.Temp T
 WHERE EXISTS (
               SELECT *
                 FROM params P
                WHERE T.Name LIKE '%' + P.param + '%'
              );

看起来很长,但如果CTE是基表,那么查询可能是数据驱动的,即如果参数值列表将来需要改变那么它只涉及更新表而不是修改硬表 - 编码值(可能在多个对象中)。