我有地名的列表,并希望他们在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