用 table 匹配字符串中的逗号分隔值
match comma separated values in a string with table
作为存储过程的一部分,我收到一串用逗号分隔的名称。名称可以是名字、姓氏、全名或介于两者之间的名称。
我如何才能知道我的 table 中是否存在该名称?
DECLARE @NameString
SET @NameString = Max,John World,Miller,Peter F, Will
Table:
ID Name
1 10_Max_Power
2 11_Tim_Miller
3 87_John_World
4 12_Peter_Foo
5 3123_Tom_Miller
6 323_Jessica_Bar
想要的结果:
ID Name
1 10_Max_Power
2 11_Tim_Miller
3 87_John_World
4 12_Peter_Foo
5 3123_Tom_Miller
理想情况下,不要传递定界参数,使用 table 类型参数。然后你可以这样做:
DECLARE @Names table (Name nvarchar(100));
INSERT INTO @Names (Name)
VALUES('Max'),
('John World'),
('Miller'),
('Peter F'),
('Will');
SELECT YT.ID,
YT.Name
FROM dbo.YourTable YT
WHERE EXISTS (SELECT 1
FROM @Names N
--Rather than inline the REPLACE you could add Computed Column
--to your table type variable/parameter.
WHERE YT.Name LIKE CONCAT('%',REPLACE(N.Name,' ','[_]'),'%'));
如果您“必须”使用定界字符串,那么您可以使用 STRING_SPLIT
(我假设您使用的是完全受支持的 SQL 服务器版本,因为没有什么可说的):
DECLARE @NameString nvarchar(4000)
SET @NameString = N'Max,John World,Miller,Peter F, Will';
SELECT YT.ID,
YT.Name
FROM dbo.YourTable YT
WHERE EXISTS (SELECT 1
FROM STRING_SPLIT (@NameString,',')
WHERE YT.Name LIKE CONCAT('%',TRIM(REPLACE(N.Name,' ','[_]')),'%')); --TRIM because Will has a leading space
不过,我也建议修复您的设计。值为 10_Max_Power
的“名称”违反规范化规则。显然 10
不是名称。同样清楚的是,您想找到名字或姓氏可能具有价值的人。因此,实际上,您的 Name
列应该 至少 3 列; Prefix
(或任何数字代表),Forename
和 Surname
(以及可选的中间名列)。
作为存储过程的一部分,我收到一串用逗号分隔的名称。名称可以是名字、姓氏、全名或介于两者之间的名称。
我如何才能知道我的 table 中是否存在该名称?
DECLARE @NameString
SET @NameString = Max,John World,Miller,Peter F, Will
Table:
ID Name
1 10_Max_Power
2 11_Tim_Miller
3 87_John_World
4 12_Peter_Foo
5 3123_Tom_Miller
6 323_Jessica_Bar
想要的结果:
ID Name
1 10_Max_Power
2 11_Tim_Miller
3 87_John_World
4 12_Peter_Foo
5 3123_Tom_Miller
理想情况下,不要传递定界参数,使用 table 类型参数。然后你可以这样做:
DECLARE @Names table (Name nvarchar(100));
INSERT INTO @Names (Name)
VALUES('Max'),
('John World'),
('Miller'),
('Peter F'),
('Will');
SELECT YT.ID,
YT.Name
FROM dbo.YourTable YT
WHERE EXISTS (SELECT 1
FROM @Names N
--Rather than inline the REPLACE you could add Computed Column
--to your table type variable/parameter.
WHERE YT.Name LIKE CONCAT('%',REPLACE(N.Name,' ','[_]'),'%'));
如果您“必须”使用定界字符串,那么您可以使用 STRING_SPLIT
(我假设您使用的是完全受支持的 SQL 服务器版本,因为没有什么可说的):
DECLARE @NameString nvarchar(4000)
SET @NameString = N'Max,John World,Miller,Peter F, Will';
SELECT YT.ID,
YT.Name
FROM dbo.YourTable YT
WHERE EXISTS (SELECT 1
FROM STRING_SPLIT (@NameString,',')
WHERE YT.Name LIKE CONCAT('%',TRIM(REPLACE(N.Name,' ','[_]')),'%')); --TRIM because Will has a leading space
不过,我也建议修复您的设计。值为 10_Max_Power
的“名称”违反规范化规则。显然 10
不是名称。同样清楚的是,您想找到名字或姓氏可能具有价值的人。因此,实际上,您的 Name
列应该 至少 3 列; Prefix
(或任何数字代表),Forename
和 Surname
(以及可选的中间名列)。