用 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(或任何数字代表),ForenameSurname(以及可选的中间名列)。