我想将字符串“val=ABC_DEF_GHI_JKL_MNO_PQR”拆分为不同的列值,并且 Parsename 函数不接受超过 4 次拆分的拆分条件。
这些值来自表,如果可能的话,需要使用 SQL 函数来实现该函数。
PARSENAME(replace(val,'_','.'),4) as col1
并返回 null。我如何分割这个值?
最佳答案
对于 SQL Server 2016,我实现了以下两个查询。 Query#1 会将字符串拆分为 string_split()
的行功能。 Query#2 会将字符串拆分为 string_split()
的列和动态枢轴技术。
创建表并插入语句:
create table testtable (teststring varchar(50));
insert into testtable values('ABC_DEF_GHI_JKL_MNO_PQR');
查询#1
select row_number()over(order by (select null)) rn, [value] as Street1 from testtable
cross apply string_split(teststring,'_')
或者没有行号,它只是:
select [value] as Street1 from testtable
cross apply string_split(teststring,'_')
查询#2:
DECLARE @cols AS NVARCHAR(MAX)='';
DECLARE @query AS NVARCHAR(MAX)='';
with cte as
(
select row_number()over(order by (select null)) rn, [value] as Street1 from testtable
cross apply string_split(teststring,'_')
)
select @cols = STUFF((SELECT distinct ',' + quotename(rn)
FROM cte
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select row_number()over(order by (select null)) rn, [value] as Street1 from testtable
cross apply string_split(teststring,''_'')
) src
pivot
(
max(street1) for rn in (' + @cols + ')
) piv'
execute(@query)
输出:
db<> fiddle here
如果您使用 MySQL 8.0,则使用递归公用表表达式,您可以轻松地将其拆分为行:
create table testtable (teststring varchar(50));
insert into testtable values('ABC_DEF_GHI_JKL_MNO_PQR');
查询:
with RECURSIVE cte (street1,level)as
(
select SUBSTRING_INDEX(teststring, '_', 1) AS street1, 1 as level
from testtable
union all
select SUBSTRING_INDEX(SUBSTRING_INDEX(teststring, "_", level+1), "_", -1),level+1
from cte inner join testtable t
on cte.street1<SUBSTRING_INDEX(SUBSTRING_INDEX(teststring, "_", level+1), "_", -1)
)
select street1 from cte
输出:
db< fiddle here
关于sql - 在SQL Server 16中的sql查询中拆分超过4个值的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67122293/