Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 解析单元格中的文本并将其转换为多列数据_Sql_Sql Server_Database_Rdbms_Datagrip - Fatal编程技术网

Sql 解析单元格中的文本并将其转换为多列数据

Sql 解析单元格中的文本并将其转换为多列数据,sql,sql-server,database,rdbms,datagrip,Sql,Sql Server,Database,Rdbms,Datagrip,我希望数据显示为: Table : test |---------------------------------------------------------| | descriptiona | |---------------------------------------------------------| |#*Summary: data1 #*Steps: data2 #*Result: d

我希望数据显示为:

Table : test
|---------------------------------------------------------| 
|      descriptiona                                       |
|---------------------------------------------------------|
|#*Summary: data1  #*Steps: data2  #*Result: data3        |        
|---------------------------------------------------------|
|#*Steps: data5  #*Summary: data6  #*Result: data4        |
|---------------------------------------------------------|
尝试使用:

summary   steps   result
data1     data2   data3
data6     data5   data4 

但这只适用于第一行。

您可以拆分字符串并在交叉应用程序中执行条件聚合

范例

返回

编辑-2012非功能替代方案

只是为了好玩,如果您正在运行SQL Server 2016或最新版本,这是一个可能的解决方案,当然不是最漂亮的:

Declare @YourTable Table ([descriptiona] varchar(50))  Insert Into @YourTable Values 
 ('#*Summary: data1 #*Steps: data2 #*Result: data3')
,('#*Steps: data5 #*Summary: data6 #*Result: data4')

Select B.* 
 From  @YourTable
 Cross Apply ( Select Summary= stuff(max(case when charindex('Summary:',value)>0 then Value end),1,10,'')
                     ,Steps  = stuff(max(case when charindex('Steps:',value)>0 then Value end)  ,1,8,'')
                     ,Result = stuff(max(case when charindex('Result:',value)>0 then Value end) ,1,9,'')
                 From (
                        Select seq   = row_number() over (order by 1/0)
                              ,value = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>' + replace((Select replace([descriptiona],'#','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                      ) B1
             ) B
其思想是从您的描述中获取一个JSON字符串,然后对其进行解析并提取相关字段,例如

SELECT
    JSON_VALUE(json_string, '$.Summary') as Summary,
    JSON_VALUE(json_string, '$.Steps') as Steps,
    JSON_VALUE(json_string, '$.Result') as Result
FROM (
        SELECT 
      '{"'+REPLACE(
        REPLACE(
          REPLACE(SUBSTRING(description, 3, LEN(description)), ' ', ''),
          ':', '":"'),
        '#*', '","') 
        + '"}' AS json_string
FROM test) A
变成

#*Summary: data1  #*Steps: data2  #*Result: data3

当然,还有一些注意事项,主要取决于表中实际包含的值

这将是痛苦的,尤其是对于SQL Server,它没有适当的regexp支持。这项任务在应用程序端更容易完成。您应该从一开始就规范化架构,并使用不同的列。谢谢。它起作用了。当charindex'Summary:'的值大于0,然后值为end,1,10,'时,您能解释一下交叉应用Select Summary=stuffmaxcase吗,?这是怎么回事?或者你可以参考任何文档。@PrateekSharma总是乐于帮助。浏览一下,您将看到仅使用字符串_split的交叉应用将生成多行。我们只需获取这些行并应用条件聚合,同时剥离摘要、步骤和结果。SQL Server 2012是否有替代方案,而不创建函数?@Prateksharma当然,请参见编辑部分。
Declare @YourTable Table ([descriptiona] varchar(50))  Insert Into @YourTable Values 
 ('#*Summary: data1 #*Steps: data2 #*Result: data3')
,('#*Steps: data5 #*Summary: data6 #*Result: data4')

Select B.* 
 From  @YourTable
 Cross Apply ( Select Summary= stuff(max(case when charindex('Summary:',value)>0 then Value end),1,10,'')
                     ,Steps  = stuff(max(case when charindex('Steps:',value)>0 then Value end)  ,1,8,'')
                     ,Result = stuff(max(case when charindex('Result:',value)>0 then Value end) ,1,9,'')
                 From (
                        Select seq   = row_number() over (order by 1/0)
                              ,value = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>' + replace((Select replace([descriptiona],'#','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                      ) B1
             ) B
SELECT
    JSON_VALUE(json_string, '$.Summary') as Summary,
    JSON_VALUE(json_string, '$.Steps') as Steps,
    JSON_VALUE(json_string, '$.Result') as Result
FROM (
        SELECT 
      '{"'+REPLACE(
        REPLACE(
          REPLACE(SUBSTRING(description, 3, LEN(description)), ' ', ''),
          ':', '":"'),
        '#*', '","') 
        + '"}' AS json_string
FROM test) A
#*Summary: data1  #*Steps: data2  #*Result: data3
{"Summary":"data1","Steps":"data2","Result":"data3"}