cwui 2024-06-13 16:57 采纳率: 27.8%
浏览 1
已结题

字符分割,单行转多行

如下图,左边是原始数据,右边是想要的结果。
可以确定的是XMDD如果大于3位,一定可以用英文逗号分隔

img

怎么写SQL

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-13 16:57
    关注

    引自免费微信小程序:皆我百晓生

    为了解决这个问题,我们可以使用SQL中的字符串处理函数。在大多数SQL数据库中,这通常涉及到SUBSTRINGLENGTH函数。但是,由于我们需要将一个字段的值分割成多个3位一组的行,我们将采用一种更高级的方法,利用窗口函数和自连接技巧。

    下面是一个可能的SQL查询实现,这里以PostgreSQL为例,因为它提供了非常强大的窗口函数和字符串处理功能。如果你使用的是其他数据库,可能需要稍作调整,但核心逻辑应该是相似的。

    WITH SplitData AS (
      SELECT
        VNAME,
        XMDD,
        -- 使用generate_series生成从1到XMDD长度/3的序列
        ROW_NUMBER() OVER (PARTITION BY VNAME ORDER BY NULL) - 1 + n AS n
      FROM (
        SELECT
          VNAME,
          XMDD,
          -- 确保XMDD长度为3的倍数,如果不是则补零
          LPAD(XMDD, (LENGTH(XMDD) + 2) / 3 * 3, '0') AS padded_XMDD
        FROM your_table_name
      ) AS t
      CROSS JOIN generate_series(1, LENGTH(padded_XMDD)/3) AS s(n)
    ),
    -- 分割字符串
    SplitXMDD AS (
      SELECT
        VNAME,
        SUBSTRING(padded_XMDD FROM n*3+1 FOR 3) AS split_XMDD
      FROM SplitData
    )
    SELECT
      VNAME,
      split_XMDD AS XMDD
    FROM SplitXMDD;
    

    请确保将your_table_name替换为你的实际表名。这个查询首先通过generate_series函数生成一个序列,该序列的长度等于XMDD字段值长度除以3(向上取整)。然后,使用窗口函数ROW_NUMBER()LPAD函数(如果XMDD的长度不是3的倍数,则在其末尾添加零,以使其成为3的倍数),我们创建了一个新的数据集,其中每个XMDD值被分割成3位一组的子串。最后,我们选择并返回了分割后的结果。

    这个查询在处理大量数据时可能会比较慢,因为generate_series和窗口函数的计算成本相对较高。如果性能成为一个问题,你可能需要考虑在应用程序级别进行处理,或者优化数据结构和索引以提高查询效率。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月13日
  • 修改了问题 6月13日
  • 修改了问题 6月13日
  • 创建了问题 6月13日

悬赏问题

  • ¥15 问题重发,R语言:代码运行过程中出现如下警告,请求如何解决!
  • ¥15 苍穹外卖拦截器token为null
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响