我有地名的列表,並希望他們在SQL數據庫的問題是性能有名字後有參考號碼匹配記錄。例如。 「巴利米納P-4sdf5g」 是否有可能使用IN和LIKE匹配記錄是否可以使用LIKE和IN作爲WHERE語句?
WHERE dbo.[Places].[Name] IN LIKE('Ballymena%','Banger%')
我有地名的列表,並希望他們在SQL數據庫的問題是性能有名字後有參考號碼匹配記錄。例如。 「巴利米納P-4sdf5g」 是否有可能使用IN和LIKE匹配記錄是否可以使用LIKE和IN作爲WHERE語句?
WHERE dbo.[Places].[Name] IN LIKE('Ballymena%','Banger%')
這是一個普遍的誤解,認爲供構建
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 + '%';
沒有,但你可以用OR代替:
WHERE (dbo.[Places].[Name] LIKE 'Ballymena%' OR
dbo.[Places].[Name] LIKE 'Banger%')
以及一個簡單的解決辦法是使用正則表達式不知道它是如何在SQL,但可能類似的東西做這個
WHERE dbo.[Places].[Name] SIMILAR TO '(Banger|Ballymena)';
或
WHERE dbo.[Places].[Name] REGEXP_LIKE(dbo.[Places].[Name],'(Banger|Ballymena)');
其中之一應該ATLEAST工作
,你可以使用或
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')
這可能會降低性能,因爲數據庫可以能夠使用索引與像(如果通配符是在結束時,你甚至有一個更好的機會),但使用時子最有可能不是。
的確可以工作,但是正則表達式的支持並不是標準的SQL .. – 2010-12-02 13:19:02
怎麼樣? – Breezer 2010-12-02 13:21:38