SQL中的REPLACE和SPLIT字符串,并从值创建变量

问题描述 投票:1回答:1

我在数据库字段中有这样的字符串:

"Anz Längsteiler":0;"Anz Querteiler":0;"BoxTyp":"M";"Führungslänge":500;"Gewicht":40;

在PowerShell中,我可以这样做:

$Hash = @{}
($BoxDS -replace '"','') -split ';' | foreach { 
       $Val = $_ -split ":" ; $Hash[$Val[0]] = $Val[1] 
}

得到这样的输出以供进一步使用:

PS C:\Windows\System32\WindowsPowerShell\v1.0> $hash

Name                           Value
----                           ----- 
BoxTyp                         M
Anz Längsteiler                0
Anz Querteiler                 0
Führungslänge                  500
Gewicht                        40

现在我想摆脱我的PowerShell脚本并创建一个SQL函数。

有没有什么办法可以用Name创建一个变量(正如你在PowerShell输出名称列中看到的那样)和保存在那里的值?

我是SQL的新手,我读到了关于REPLACE()SPLIT()的内容,但是我无法理解它。特别是在动态创建变量时。

我在MS SQL Server 2016上

sql sql-server tsql sql-server-2016
1个回答
2
投票

如果你的sql-server版本是2016,你可以尝试使用STRING_SPLITE函数和CROSS APPLY

我会用STRING_SPLIT写一个子查询来将;拆分为结果集。

使用指定的分隔符拆分字符表达式。

然后编写另一个子查询查询,通过:基于上部结果集拆分CROSS APPLY

查询1:

SELECT  MAX(CASE WHEN t2.rn = 1 THEN t2.value end) Name,
        MAX(CASE WHEN t2.rn = 2 THEN t2.value end) Value
FROM (
  SELECT value as val
  FROM STRING_SPLIT(Replace('"Anz Längsteiler":0;"Anz Querteiler":0;"BoxTyp":"M";"Führungslänge":500;"Gewicht":40;','"',''),';')
) t1 CROSS APPLY (
  SELECT *,ROW_NUMBER() OVER(PARTITION BY t1.val order by t1.val) rn
  FROM STRING_SPLIT(t1.val,':') 
) t2
where t1.val<>''
GROUP BY t1.val

Results

|            Name | Value |
|-----------------|-------|
| Anz Längsteiler |     0 |
|  Anz Querteiler |     0 |
|          BoxTyp |     M |
|   Führungslänge |   500 |
|         Gewicht |    40 |
© www.soinside.com 2019 - 2024. All rights reserved.