获取逗号分隔字符串行的SQL Server查询

获取逗号分隔字符串行的SQL Server查询,sql,sql-server,Sql,Sql Server,如果我有一个像这样的列,它有字符串分隔的值 如果用户从程序中传入22b或24,我如何返回第2-4行 我尝试了外卡和“喜欢”,但运气不好 some_column ------- 21a 22b 21a, 22b, 24, 25 21a, 22b, 24, 25 您可以使用递归cte进行拆分。。。根据数据量的不同,这可能会变得非常痛苦!无论如何,举个例子: DECLARE @t TABLE( x NVARCHAR(100) ) INSERT INTO @t VALUES ('21a'), ('

如果我有一个像这样的列,它有字符串分隔的值

如果用户从程序中传入22b或24,我如何返回第2-4行

我尝试了外卡和“喜欢”,但运气不好

some_column
-------
21a
22b
21a, 22b, 24, 25
21a, 22b, 24, 25

您可以使用递归cte进行拆分。。。根据数据量的不同,这可能会变得非常痛苦!无论如何,举个例子:

DECLARE @t TABLE(
 x NVARCHAR(100)
)

INSERT INTO @t VALUES ('21a'), ('22b'), ('21a, 22b, 24, 25'), ('21a, 22b, 24, 25');


WITH cte AS(
  SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rn
        ,X
    FROM @t t
),
cteRec AS(
    SELECT  rn,
            1 lvl,
            x AS OrigCol,
            x AS SplitCol
      FROM cte
    UNION ALL
    SELECT  rn,
            lvl+1 AS lvl,
            SUBSTRING(OrigCol, CHARINDEX(',', OrigCol)+1, LEN(OrigCol) - CHARINDEX(',', OrigCol)),
            SUBSTRING(OrigCol, 1, CHARINDEX(',', OrigCol)-1)
      FROM cteRec
      WHERE CHARINDEX(',', OrigCol) > 0
),
cteFilter AS(
  SELECT rn, REPLACE(SplitCol, ' ', '') SplitCol
    FROM cteRec
    WHERE CHARINDEX(',', SplitCol) = 0
)
SELECT DISTINCT     c.rn,
                    c.x
  FROM cte AS c
  JOIN cteFilter AS f ON c.rn = f.rn
  WHERE f.SplitCol = '24' OR f.SplitCol = '22b'
  order by rn
  OPTION (MAXRECURSION 0)

您可以使用递归cte进行拆分。。。根据数据量的不同,这可能会变得非常痛苦!无论如何,举个例子:

DECLARE @t TABLE(
 x NVARCHAR(100)
)

INSERT INTO @t VALUES ('21a'), ('22b'), ('21a, 22b, 24, 25'), ('21a, 22b, 24, 25');


WITH cte AS(
  SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rn
        ,X
    FROM @t t
),
cteRec AS(
    SELECT  rn,
            1 lvl,
            x AS OrigCol,
            x AS SplitCol
      FROM cte
    UNION ALL
    SELECT  rn,
            lvl+1 AS lvl,
            SUBSTRING(OrigCol, CHARINDEX(',', OrigCol)+1, LEN(OrigCol) - CHARINDEX(',', OrigCol)),
            SUBSTRING(OrigCol, 1, CHARINDEX(',', OrigCol)-1)
      FROM cteRec
      WHERE CHARINDEX(',', OrigCol) > 0
),
cteFilter AS(
  SELECT rn, REPLACE(SplitCol, ' ', '') SplitCol
    FROM cteRec
    WHERE CHARINDEX(',', SplitCol) = 0
)
SELECT DISTINCT     c.rn,
                    c.x
  FROM cte AS c
  JOIN cteFilter AS f ON c.rn = f.rn
  WHERE f.SplitCol = '24' OR f.SplitCol = '22b'
  order by rn
  OPTION (MAXRECURSION 0)

我不确定我是否明白为什么你喜欢的东西不起作用。这段代码为我返回第2行到第4行

create table #test (some_column varchar(20));

insert  #test values ('21a'), ('22b'), ('21a, 22b, 24, 25'), ('21a, 22b, 24, 25');

select *
from    #test
where   some_column like '%22b%'
        or some_column like '%24%';


我不确定我是否明白为什么你喜欢的东西不起作用。这段代码为我返回第2行到第4行

create table #test (some_column varchar(20));

insert  #test values ('21a'), ('22b'), ('21a, 22b, 24, 25'), ('21a, 22b, 24, 25');

select *
from    #test
where   some_column like '%22b%'
        or some_column like '%24%';


Protip:normalization,否则您将得到一些丑陋的拆分函数:)正如@lad2025所建议的,规范化您的数据确实是一个更好的主意-创建一个具有单个值的表,而不是逗号列表。我不希望…如果所有其他操作都失败,那么我们将这样做,因此&被解释为“或”?否则就只有第3行和第4行了,因为第2行只有22b,而不是24…@Tyron78是的,对不起…Protip:正常化,否则你会得到一些丑陋的分割函数:)正如@lad2025所建议的,规范化数据确实是一个更好的主意-创建一个具有单个值的表,而不是一个逗号列表。我不希望…如果所有其他操作都失败,那么我们将这样做,因此&被解释为“或”?否则就只有第3行和第4行了,因为第2行只有22b而不是24…@Tyron78是的,对不起…如果您使用的是SQL 2016或更新版本,兼容级别为130或更高,则可以使用现在内置在SQL中的STRING_SPLIT()函数。如果您使用的是SQL 2016或更新版本,兼容级别为130或更高,则可以使用STRING_SPLIT()现在内置到SQL中的函数。