是否可以将LIKE和IN用于WHERE语句?

时间:2010-12-02 13:12:20

标签: sql

我有一个地名列表,并希望将它们与sql数据库中的记录相匹配,问题是属性在名称后面有引用号。例如。 'Ballymena P-4sdf5g' 是否可以使用IN和LIKE匹配记录

WHERE dbo.[Places].[Name] IN LIKE('Ballymena%','Banger%')

4 个答案:

答案 0 :(得分:12)

不,但您可以使用OR代替:

WHERE (dbo.[Places].[Name] LIKE 'Ballymena%' OR
       dbo.[Places].[Name] LIKE 'Banger%')

答案 1 :(得分:9)

对于构造

,这是一种常见的误解
b IN (x, y, z)

(x, y, z)代表一组。它不是。

相反,它只是

的语法糖
(b = x OR b = y OR b = z)

SQL只有一个数据结构:表。如果要将搜索文本值作为一个集进行查询,请将它们放入表中。然后,您可以使用JOIN条件中的Places LIKE将您的搜索文本表JOIN发送到WITH Places (Name) AS ( SELECT Name FROM ( VALUES ('Ballymeade Country Club'), ('Ballymena Candles'), ('Bangers & Mash Cafe'), ('Bangebis') ) AS Places (Name) ), SearchText (search_text) AS ( SELECT search_text FROM ( VALUES ('Ballymena'), ('Banger') ) AS SearchText (search_text) ) SELECT * FROM Places AS P1 LEFT OUTER JOIN SearchText AS S1 ON P1.Name LIKE S1.search_text + '%'; 表格,例如

{{1}}

答案 2 :(得分:2)

一个简单的解决方案是使用正则表达式,不确定它是如何在sql中完成的,但可能与此类似的东西

WHERE dbo.[Places].[Name]  SIMILAR TO '(Banger|Ballymena)';

WHERE dbo.[Places].[Name] REGEXP_LIKE(dbo.[Places].[Name],'(Banger|Ballymena)');

其中一个应该至少工作

答案 3 :(得分:1)

你可以使用OR

WHERE 
  dbo.[Places].[Name] LIKE 'Ballymena%' 
  OR dbo.[Places].[Name] LIKE 'Banger%'

或者在空格处拆分字符串,如果places.name 始终采用相同的格式。

WHERE SUBSTRING(dbo.[Places].[Name], 1, CHARINDEX(dbo.[Places].[Name], ' ')) 
  IN ('Ballymena', 'Banger')

这可能会降低性能,因为数据库可能能够使用类似的索引(如果通配符最后你有更好的机会),但很可能不是在使用子字符串时。 / p>