sql - 在SQL Server 16中的sql查询中拆分超过4个值的字符串值

标签 sql sql-server

我想将字符串“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,'_')
<表类=“s-表”> <标题> rn 街道1 <正文> 1 ABC 2 DEF 3 GHI 4 JKL 5 移动网络 6 PQR

或者没有行号,它只是:

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)
    

输出:

<表类=“s-表”> <标题> 1 2 3 4 5 6 <正文> ABC DEF GHI JKL 移动网络 PQR

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

输出:

<表类=“s-表”> <标题> street1 <正文> ABC DEF GHI JKL 移动网络 PQR

db< fiddle here

关于sql - 在SQL Server 16中的sql查询中拆分超过4个值的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67122293/

相关文章:

sql - 比较两个不同表中的不相同字段

php - 如何在另一个 Query MySQL 上执行更新查询?

sql - Oracle SQL 查询按不同表中的列值排序

sql - PostgreSQL - 使用 LIMIT INNER JOIN 两个表

Java MS SQL 在插入中选择

SQL 优化 - 从历史表中获取两个不同日期的值

c# - 使用 SimpleMembership/Sql Server CE、MongoDB 管理用户配置文件

sql - 查找包含特定表或列的所有 View

mysql - 如何编写 SQL 查询来检查一个表上的多对多关系是否是另一个表上多对多关系的子集?

sql-server - 如何在事务期间检查 SQL Server 数据库?