2010-12-02 37 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') 

這可能會降低性能,因爲數據庫可以能夠使用索引與像(如果通配符是在結束時,你甚至有一個更好的機會),但使用時子最有可能不是。

相關問題