2010-12-02 13 views
9

Yer isimlerinin bir listesini alıyorum ve bunları bir sql veritabanındaki kayıtlarla eşleştirmek istiyorum; sorun, özelliklerin adından sonra referans numaralarına sahip olmasıdır. Örneğin. 'Ballymena P-4sdf5g' mümkün kayıtlarıWHERE statüsü için LIKE ve IN kullanmak mümkün mü?

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

cevap

8

Bu yaygın bir yanlış kanı yapı için

b IN (x, y, z) 

o (x, y, z) kümesi temsil ettiğini bu. O değil.

ziyade,

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

SQL vardır ama bir veri yapısı için sadece sözdizimsel şeker: tablo. Arama metni değerlerini bir küme olarak sorgulamak isterseniz, bunları bir tabloya koyun. JOIN arama metnini tablonuza LIKE kullanarak JOIN tablosuna JOIN yapabilirsiniz.

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

Hayır maç için IN kullanmak ve GİBİ mı, ama bunun yerine kullanmak VEYA edebilirsiniz:

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

iyi basit bir çözüm normal ifade kullanarak olacağını Bu

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

veya

için sql ama muhtemelen benzer bir şey nasıl yapıldığını bilmiyorum Bunlardan
WHERE dbo.[Places].[Name] REGEXP_LIKE(dbo.[Places].[Name],'(Banger|Ballymena)'); 

biri en az

+0

Gerçekten de işe yarayabilir, ancak normal ifadeler normaldir .. –

+0

buna benzer nedir? – Breezer

+0

'' ile benzer 'standartta regexp_like' ile değiştiriliyor. Göreceğiz. – Donnie

1

kullanabilirdin çalışmak VEYA

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

veya places.name hep aynı formatta ise, boşlukta dize ayrılmalıyız. Veritabanı gibi indeksler kullanmak mümkün olabilir çünkü

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

Buna performansı düşürebilir (joker sonunda ise hatta daha iyi bir şans var) ama alt dizeyi kullanarak büyük olasılıkla değilken.

+0

Maalesef bazı yer isimleri boşluk içeriyor ama hiçbiri daha az iyi bir çözüm değil +1 – Euclid

İlgili konular