2010-12-02 14 views
9

私は地名のリストを持っていて、それらをSQLデータベースのレコードに一致させたいのですが、問題はそのプロパティの後に名前の後に参照番号があることです。例えば。 「バリミーナP-4sdf5g」 は、INを使用することが可能であり、情報はありませんWHERE文にLIKEとINを使用できますか?

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を持っているが、1つのデータ構造のための単なるシンタックスシュガーです:テーブル。検索テキスト値をセットとして照会する場合は、それらを表に入れます。あなたはJOINPlacesテーブルにあなたの検索テキストテーブルLIKEJOINの条件を使用してテーブルを使用することができます。

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

に一致するように好きですが、あなたは使用またはその代わりにすることができます:正規表現を使用することでしょうもシンプルなソリューションを

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

をこの

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

または

に似それはSQLで行うのかどうかはわかりませんが、おそらく何かそれらの
WHERE dbo.[Places].[Name] REGEXP_LIKE(dbo.[Places].[Name],'(Banger|Ballymena)'); 

1は、少なくとも

+0

実際に動作する可能性がありますが、正規表現のサポートは標準SQLではありません。 –

+0

何について似ていますか? – Breezer

+0

'に似ている'はおそらく標準で 'regexp_like'と置き換えられています。我々は見るでしょう。 – Donnie

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

部分文字列を使用したときに、データベースなどでインデックスを使用することができる(ワイルドカードが末尾にある場合は、より良いチャンスを持っている)が、おそらくないかもしれないので、これは、パフォーマンスが低下することがあります。

+0

残念ながら、いくつかの場所名にはスペースが含まれていますが、それほど良い解決策はありません+1 – Euclid

関連する問題