sql - 在 sql select 查询中使用分隔符重新排列字符串值

标签 sql select-query regexp-substr

我有一个包含字符串值的列,其分隔符如下所示,我在 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/

相关文章:

mysql - SELECT 查询如何在多个列上工作而不在列名之间使用逗号?

android - sqlite android 中的波斯语/阿拉伯语搜索给出了错误的结果

oracle - 从 Oracle Select 中的字符串中检索前 X 个单词

MySQL在删除时设置默认字段值

mysql - 为什么我的 JSP 登录页面不工作?我有一个有效的用户名和密码,但是比较输入的语句

php - 从表中选择逗号分隔的记录

sql - PLSQL 从字符串末尾开始显示数字

sql - MySQL查询以逗号分隔的字符串查找值

mysql - 如何从MySQL表中的一组行中获取平均值和最后一条数据