【发布时间】:2011-05-19 03:12:19
【问题描述】:
我有一个地名列表,并希望将它们与 sql 数据库中的记录相匹配,问题是属性在名称后有参考编号。例如。 '巴利米纳 P-4sdf5g' 是否可以使用 IN 和 LIKE 来匹配记录
WHERE dbo.[Places].[Name] IN LIKE('Ballymena%','Banger%')
【问题讨论】:
标签: sql
我有一个地名列表,并希望将它们与 sql 数据库中的记录相匹配,问题是属性在名称后有参考编号。例如。 '巴利米纳 P-4sdf5g' 是否可以使用 IN 和 LIKE 来匹配记录
WHERE dbo.[Places].[Name] IN LIKE('Ballymena%','Banger%')
【问题讨论】:
标签: sql
不,但您可以使用 OR:
WHERE (dbo.[Places].[Name] LIKE 'Ballymena%' OR
dbo.[Places].[Name] LIKE 'Banger%')
【讨论】:
对于构造,这是一个常见的误解
b IN (x, y, z)
(x, y, z) 代表一个集合。它不是。
相反,它只是语法糖
(b = x OR b = y OR b = z)
SQL 只有一种数据结构:表。如果要将搜索文本值作为一组查询,则将它们放入表中。然后您可以在JOIN 条件中使用LIKE 将您的搜索文本表JOIN 到您的Places 表,例如
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 + '%';
【讨论】:
一个简单的解决方案是使用正则表达式,不确定它是如何在 sql 中完成的,但可能与此类似
WHERE dbo.[Places].[Name] SIMILAR TO '(Banger|Ballymena)';
或
WHERE dbo.[Places].[Name] REGEXP_LIKE(dbo.[Places].[Name],'(Banger|Ballymena)');
其中一个应该至少可以工作
【讨论】:
similar to 应该在标准中被 regexp_like 取代。我们拭目以待。
你可以使用 OR
WHERE
dbo.[Places].[Name] LIKE 'Ballymena%'
OR dbo.[Places].[Name] LIKE 'Banger%'
如果places.name 是always,则在空格处拆分字符串。
WHERE SUBSTRING(dbo.[Places].[Name], 1, CHARINDEX(dbo.[Places].[Name], ' '))
IN ('Ballymena', 'Banger')
这可能会降低性能,因为数据库可能能够使用带有 like 的索引(如果通配符在最后,你有更好的机会),但在使用子字符串时很可能不会。
【讨论】: