我有一个地名列表,并希望将它们与sql数据库中的记录相匹配,问题是属性在名称后面有引用号。例如。 'Ballymena P-4sdf5g' 是否可以使用IN和LIKE匹配记录
WHERE dbo.[Places].[Name] IN LIKE('Ballymena%','Banger%')
答案 0 :(得分:12)
不,但您可以使用OR代替:
WHERE (dbo.[Places].[Name] LIKE 'Ballymena%' OR
dbo.[Places].[Name] LIKE 'Banger%')
答案 1 :(得分:9)
对于构造
,这是一种常见的误解b IN (x, y, z)
(x, y, z)
代表一组。它不是。
相反,它只是
的语法糖(b = x OR b = y OR b = z)
SQL只有一个数据结构:表。如果要将搜索文本值作为一个集进行查询,请将它们放入表中。然后,您可以使用JOIN
条件中的Places
LIKE
将您的搜索文本表JOIN
发送到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 + '%';
表格,例如
{{1}}
答案 2 :(得分:2)
一个简单的解决方案是使用正则表达式,不确定它是如何在sql中完成的,但可能与此类似的东西
WHERE dbo.[Places].[Name] SIMILAR TO '(Banger|Ballymena)';
或
WHERE dbo.[Places].[Name] REGEXP_LIKE(dbo.[Places].[Name],'(Banger|Ballymena)');
其中一个应该至少工作
答案 3 :(得分:1)
你可以使用OR
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')
这可能会降低性能,因为数据库可能能够使用类似的索引(如果通配符最后你有更好的机会),但很可能不是在使用子字符串时。 / p>