我有一个包含字符串值的列,其分隔符如下所示,我在 sql 查询的选择部分中使用它。
0040~0040~0040~0040~0040^00~00~00~01~05^100~001~010~011~015^00~00~00~01~05
各个头部使用 '^'
分隔,如下所示。
Head1 = 0040~0040~0040~0040~0040
Head2 = 00~00~00~01~05
Head3 = 100~001~010~011~015
Head4 = 00~00~00~01~05
所有 4 个头具有相同数量的条目,并以 '~'
分隔(条目不一定是 5)。
我需要的是将所有 4 个头中的第一个条目合并为一个。如下图。
0040-00-100-00
由 '-'
分隔
然后是第二个条目,依此类推所有条目。
如果条目数像我的字符串一样为 4,则格式化输出应如下所示(每个条目用逗号分隔):
0040-00-100-00,0040-00-001-00,0040-00-010-00,0040-01-011-01,
0040-05-015-05
我想在获取此列值的选择查询中执行此操作。
示例..
select x,y,z,(this is where I want this changes to be done.) from abc
最佳答案
第一个 CTE 只是创建虚拟记录的选择,您可以忽略它。第二个 CTE 是递归地分割每个 ID ^ 上的列值,第三个 CTE 是合并由 -
分隔的部分。每个 ID 使用 XML,最后一个 CTE 是将它们全部组合成一个字符串,用 ,
分隔。 。在组合所有内容之前必须有一个 ID 列进行分组。它将适用于 n 行。
;WITH myTable (id, MyColumn)
AS (SELECT 1, '0040~0040~0040~0040^00~00~00~01~05^100~001~010~011~015^00~00~00~01~05'
union ALL SELECT 2, 'b040~0040~0040~0040^b0~00~00~01~05^b00~001~010~011~015^b02~00~00~01~05'
union ALL SELECT 3, 'c040~0040~0040~0040^c0~00~00~01~05^c00~001~010~011~015^c02~00~00~01~05'
union ALL SELECT 4, 'd040~0040~0040~0040^d0~00~00~01~05^d00~001~010~011~015^d02~00~00~01~05'
),
RecursiveCTE (id, sub, startInd, endInd)
AS
(
SELECT
id,
convert(varchar, SUBSTRING(MyColumn, 1, CHARINDEX('^', MyColumn ))) as sub
, 0 AS startInd
, CHARINDEX('^', MyColumn ) AS endInd
from mytable
UNION ALL
select id,
convert(varchar, SUBSTRING((SELECT MyColumn FROM myTable WHERE id = dr.id), endInd + 1, endInd - startInd)),
endInd,
CHARINDEX('^', (SELECT MyColumn FROM myTable WHERE id = dr.id), endInd + 1) as endInd
from RecursiveCTE dr
where dr.endInd <> 0
),
PerIDSeperatedByDash AS (
select id,
STUFF((
select '-' + SUBSTRING(drinner.sub, 1, CHARINDEX('~', drinner.sub) - 1)
from RecursiveCTE drinner
WHERE (drinner.id = drouter.id)
FOR XML PATH ('')),1,1,'') AS DashSeperated
from RecursiveCTE drouter
group by id)
SELECT DISTINCT STUFF((
SELECT ',' + ds.DashSeperated
FROM PerIDSeperatedByDash ds
ORDER BY id
FOR XML PATH ('')),1,1,'')
from PerIDSeperatedByDash
关于sql - 在 sql select 查询中使用分隔符重新排列字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36914279/