获取逗号分隔字符串行的SQL Server查询
如果我有一个像这样的列,它有字符串分隔的值 如果用户从程序中传入22b或24,我如何返回第2-4行 我尝试了外卡和“喜欢”,但运气不好获取逗号分隔字符串行的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'), ('
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中的函数。