You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于分隔符拆分数组后验证并处理订单数据的技术需求

数据表处理解决方案

原始数据表

ordrnbrvehiclenamedescriptionidtotpriceind_price
132tesla123@21000@bsd@23000@wer@410001saR84000
135toyotaabc@21000@bsd@23002aqE23300
138hondaabc@21003xDY2100
141kiatext6iPQ10000
145Mazdanull90ER9000
147BMWnull69TY90000

处理规则

  • 若description列包含@分隔符:
    1. 按@拆分该列,提取所有值(即偶数位置的元素,格式为k1@v1@k2@v2...)
    2. 筛选出值>=10000的记录,对每一个符合条件的值复制原行
    3. 给ordrnbr添加后缀-1、-2...,按符合条件的值的顺序编号
    4. 将该值填入ind_price列
    5. 值<10000的对应记录直接过滤
  • 若description列不含@分隔符:
    1. 判断totprice值,若<10000则过滤该行
    2. 否则给ordrnbr添加-1后缀,ind_price填入totprice的值

期望结果

ordrnbrvehiclenamedescriptionidtotpriceind_price
132-1tesla123@21000@bsd@23000@wer@410001saR8400021000
132-2tesla123@21000@bsd@23000@wer@410001saR8400023000
132-3tesla123@21000@bsd@23000@wer@410001saR8400041000
135-1toyotaabc@21000@bsd@23002aqE2330021000
141-1kiatext6iPQ1000010000
147-1BMWnull69TY9000090000

完整SQL解决方案(PostgreSQL)

WITH split_desc AS (
    SELECT
        ordrnbr,
        vehiclename,
        description,
        id,
        totprice,
        -- 拆分description,提取偶数位置的value(索引从1开始)
        UNNEST(ARRAY(
            SELECT elem FROM UNNEST(STRING_TO_ARRAY(description, '@')) elem
            WITH ORDINALITY
            WHERE ordinality % 2 = 0
        )) AS ind_price_candidate,
        -- 给每个符合条件的value按原顺序编号
        ROW_NUMBER() OVER (PARTITION BY ordrnbr ORDER BY (
            SELECT ordinality FROM UNNEST(STRING_TO_ARRAY(description, '@')) elem 
            WITH ORDINALITY WHERE ordinality%2=0 AND elem=UNNEST(STRING_TO_ARRAY(description, '@'))
        )) AS rn
    FROM your_table_name
    WHERE description LIKE '%@%'
),
filtered_split AS (
    SELECT
        ordrnbr || '-' || rn AS ordrnbr,
        vehiclename,
        description,
        id,
        totprice,
        ind_price_candidate::NUMERIC AS ind_price
    FROM split_desc
    WHERE ind_price_candidate::NUMERIC >= 10000
),
no_at_rows AS (
    SELECT
        ordrnbr || '-1' AS ordrnbr,
        vehiclename,
        description,
        id,
        totprice,
        totprice AS ind_price
    FROM your_table_name
    WHERE description NOT LIKE '%@%'
        AND totprice >= 10000
)
SELECT * FROM filtered_split
UNION ALL
SELECT * FROM no_at_rows
ORDER BY ordrnbr;

说明

  1. split_desc CTE:处理含@的行,拆分description并提取所有value,同时给每个value按原顺序编号
  2. filtered_split CTE:筛选出value>=10000的记录,拼接ordrnbr后缀并转换value为数值类型
  3. no_at_rows CTE:处理不含@的行,筛选totprice>=10000的记录,添加后缀并填充ind_price
  4. 最后通过UNION ALL合并两部分结果,按ordrnbr排序

替换your_table_name为实际的表名即可运行。

内容的提问来源于stack exchange,提问作者Balaji Venkatachalam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 14:57:04