基于分隔符拆分数组后验证并处理订单数据的技术需求
数据表处理解决方案
原始数据表
| ordrnbr | vehiclename | description | id | totprice | ind_price |
|---|---|---|---|---|---|
| 132 | tesla | 123@21000@bsd@23000@wer@41000 | 1saR | 84000 | |
| 135 | toyota | abc@21000@bsd@2300 | 2aqE | 23300 | |
| 138 | honda | abc@2100 | 3xDY | 2100 | |
| 141 | kia | text | 6iPQ | 10000 | |
| 145 | Mazda | null | 90ER | 9000 | |
| 147 | BMW | null | 69TY | 90000 |
处理规则
- 若
description列包含@分隔符:- 按
@拆分该列,提取所有值(即偶数位置的元素,格式为k1@v1@k2@v2...) - 筛选出值>=10000的记录,对每一个符合条件的值复制原行
- 给
ordrnbr添加后缀-1、-2...,按符合条件的值的顺序编号 - 将该值填入
ind_price列 - 值<10000的对应记录直接过滤
- 按
- 若
description列不含@分隔符:- 判断
totprice值,若<10000则过滤该行 - 否则给
ordrnbr添加-1后缀,ind_price填入totprice的值
- 判断
期望结果
| ordrnbr | vehiclename | description | id | totprice | ind_price |
|---|---|---|---|---|---|
| 132-1 | tesla | 123@21000@bsd@23000@wer@41000 | 1saR | 84000 | 21000 |
| 132-2 | tesla | 123@21000@bsd@23000@wer@41000 | 1saR | 84000 | 23000 |
| 132-3 | tesla | 123@21000@bsd@23000@wer@41000 | 1saR | 84000 | 41000 |
| 135-1 | toyota | abc@21000@bsd@2300 | 2aqE | 23300 | 21000 |
| 141-1 | kia | text | 6iPQ | 10000 | 10000 |
| 147-1 | BMW | null | 69TY | 90000 | 90000 |
完整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;
说明
- split_desc CTE:处理含
@的行,拆分description并提取所有value,同时给每个value按原顺序编号 - filtered_split CTE:筛选出value>=10000的记录,拼接ordrnbr后缀并转换value为数值类型
- no_at_rows CTE:处理不含
@的行,筛选totprice>=10000的记录,添加后缀并填充ind_price - 最后通过
UNION ALL合并两部分结果,按ordrnbr排序
替换your_table_name为实际的表名即可运行。
内容的提问来源于stack exchange,提问作者Balaji Venkatachalam
相关产品推荐
相关产品推荐

