2010-12-02 72 views
9

我有地名的列表,并希望他们在SQL数据库的问题是性能有名字后有参考号码匹配记录。例如。 “巴利米纳P-4sdf5g” 是否有可能使用IN和LIKE匹配记录是否可以使用LIKE和IN作为WHERE语句?

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

回答

8

这是一个普遍的误解,认为供构建

b IN (x, y, z) 

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

相反,它仅仅是语法糖

(b = x OR b = y OR b = z) 

SQL有但是一个数据结构:该表。如果你想查询搜索文本值作为一个集合,然后把它们放到一个表中。你可以自己JOIN搜索文本表格到您的Places表中JOIN条件使用LIKE例如

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 + '%'; 
12

没有,但你可以用OR代替:

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

以及一个简单的解决办法是使用正则表达式不知道它是如何在SQL,但可能类似的东西做这个

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

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

其中之一应该ATLEAST工作

+0

的确可以工作,但是正则表达式的支持并不是标准的SQL .. – 2010-12-02 13:19:02

+0

怎么样? – Breezer 2010-12-02 13:21:38

1

,你可以使用或

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') 

这可能会降低性能,因为数据库可以能够使用索引与像(如果通配符是在结束时,你甚至有一个更好的机会),但使用时子最有可能不是。

相关问题