SQL Server中拆分PIDS列至GID与PACKAGEID列的技术求助
拆分SQL Server表中PIDS列的实现方案
我的SQL Server表中有一列PIDS,数据示例如下:
| PIDs |
|---|
| GID: 2672, PACKAGEID: 91290 |
| PACKAGEID: 130116, GID: 7d78b |
| GID: 09e541, PACKAGEID: 17105 |
| GID: 14e3ba, PACKAGEID: 80017 |
| PACKAGEID: 730829, GID: a871c |
| PACKAGEID: 1009409, GID: c8b2 |
需要将PIDS列拆分为GID和PACKAGEID两列,支持以下两种输出格式:
格式一:仅保留ID值
| GID | PACKAGEID |
|---|---|
| 2672 | 91290 |
| 7d78b | 130116 |
| 09e541 | 17105 |
| 14e3ba | 80017 |
| a871c | 730829 |
| c8b2 | 1009409 |
实现SQL
SELECT -- 提取GID的纯值 TRIM(SUBSTRING(PIDS, CHARINDEX('GID:', PIDS) + 4, CHARINDEX(',', PIDS, CHARINDEX('GID:', PIDS)) - CHARINDEX('GID:', PIDS) - 4)) AS GID, -- 提取PACKAGEID的纯值 TRIM(SUBSTRING(PIDS, CHARINDEX('PACKAGEID:', PIDS) + 10, CASE WHEN CHARINDEX(',', PIDS, CHARINDEX('PACKAGEID:', PIDS)) > 0 THEN CHARINDEX(',', PIDS, CHARINDEX('PACKAGEID:', PIDS)) - CHARINDEX('PACKAGEID:', PIDS) - 10 ELSE LEN(PIDS) - CHARINDEX('PACKAGEID:', PIDS) - 9 END)) AS PACKAGEID FROM YourTableName;
说明:通过CHARINDEX定位关键词位置,SUBSTRING截取对应片段,TRIM去除多余空格,兼容GID和PACKAGEID顺序不固定的情况,以及最后一个字段无逗号的场景。
格式二:保留前缀(如GID:xxxx)
| GID | PACKAGEID |
|---|---|
| GID:2672 | PACKAGEID:91290 |
| GID:7d78b | PACKAGEID:130116 |
| GID:09e541 | PACKAGEID:17105 |
| GID:14e3ba | PACKAGEID:80017 |
| GID:a871c | PACKAGEID:730829 |
| GID:c8b2 | PACKAGEID:1009409 |
实现SQL(方法一:拼接前缀)
SELECT 'GID:' + TRIM(SUBSTRING(PIDS, CHARINDEX('GID:', PIDS) + 4, CHARINDEX(',', PIDS, CHARINDEX('GID:', PIDS)) - CHARINDEX('GID:', PIDS) - 4)) AS GID, 'PACKAGEID:' + TRIM(SUBSTRING(PIDS, CHARINDEX('PACKAGEID:', PIDS) + 10, CASE WHEN CHARINDEX(',', PIDS, CHARINDEX('PACKAGEID:', PIDS)) > 0 THEN CHARINDEX(',', PIDS, CHARINDEX('PACKAGEID:', PIDS)) - CHARINDEX('PACKAGEID:', PIDS) - 10 ELSE LEN(PIDS) - CHARINDEX('PACKAGEID:', PIDS) - 9 END)) AS PACKAGEID FROM YourTableName;
实现SQL(方法二:直接截取带前缀的片段)
SELECT TRIM(SUBSTRING(PIDS, CHARINDEX('GID:', PIDS), CASE WHEN CHARINDEX(',', PIDS, CHARINDEX('GID:', PIDS)) > 0 THEN CHARINDEX(',', PIDS, CHARINDEX('GID:', PIDS)) - CHARINDEX('GID:', PIDS) ELSE LEN(PIDS) - CHARINDEX('GID:', PIDS) + 1 END)) AS GID, TRIM(SUBSTRING(PIDS, CHARINDEX('PACKAGEID:', PIDS), CASE WHEN CHARINDEX(',', PIDS, CHARINDEX('PACKAGEID:', PIDS)) > 0 THEN CHARINDEX(',', PIDS, CHARINDEX('PACKAGEID:', PIDS)) - CHARINDEX('PACKAGEID:', PIDS) ELSE LEN(PIDS) - CHARINDEX('PACKAGEID:', PIDS) + 1 END)) AS PACKAGEID FROM YourTableName;
说明:方法二直接从关键词(GID:/PACKAGEID:)开始截取到逗号或结尾,再去除空格,更简洁地保留带前缀的格式。
内容的提问来源于stack exchange,提问作者Sreeni P
相关产品推荐
相关产品推荐

