使用 SQL 在字段内解析
Parsing within a field using SQL
我们在需要进一步解析的一列中接收数据。在此示例中,分隔符是 ~。
目标是从其各自的对中获取通过或失败值。
SL
数据
1
“PARAM-0040,PASS~PARAM-0045,PASS~PARAM-0070,PASS”
2
"PARAM-0040,FAIL~PARAM-0045,FAIL~PARAM-0070,PASS"
要求的结果:
SL
PARAM-0040
PARAM-0045
PARAM-0070
1
通过
通过
通过
2
失败
失败
通过
这将是更大的 SQL 查询的一部分,我们将在其中选择许多其他列,这三列也将从源中提取并作为选定列传递到查询中。
例如
Select Column1, Column2, [ Parse code ] as PARAM-0040, [ Parse code ] as PARAM-0045, [ Parse code ] as PARAM-0070, Column6 .....
谢谢
您可以使用正则表达式来做到这一点。但是正则表达式是非标准的。
这是在 postgresql 中的实现方式:REGEXP_MATCHES()
https://www.postgresqltutorial.com/postgresql-regexp_matches/
在 postgresql 中 regexp_matches returns 零个或多个值。那么它必须被分解(因此 {})
一个更简单的方法,同样在 postgresql 中是使用子字符串。
子字符串('foobar' 来自 'o(.)b')
喜欢:
select substring('PARAM-0040,PASS~PARAM-0045,PASS~PARAM-0070,PASS' from 'PARAM-0040,([^~]+)~');
substring
-----------
PASS
(1 row)
您可以使用 str_to_map
函数来拆分数据,然后提取每个参数的值。此示例将首先将每个 param/value 对拆分为 ~
,然后再将参数和值拆分为 ,
。
您的示例数据的可重现示例:
WITH my_table AS (
SELECT 1 as SL, "PARAM-0040,PASS~PARAM-0045,PASS~PARAM-0070,PASS" as DATA
UNION ALL
SELECT 2 as SL, "PARAM-0040,FAIL~PARAM-0045,FAIL~PARAM-0070,PASS" as DATA
),
param_mapped_data AS (
SELECT SL, str_to_map(DATA,"~",",") param_map FROM my_table
)
SELECT
SL,
param_map['PARAM-0040'] AS PARAM0040,
param_map['PARAM-0045'] AS PARAM0045,
param_map['PARAM-0070'] AS PARAM0070
FROM
param_mapped_data
假设您的 table 的实际代码被命名为 my_table
WITH param_mapped_data AS (
SELECT SL, str_to_map(DATA,"~",",") param_map FROM my_table
)
SELECT
SL,
param_map['PARAM-0040'] AS PARAM0040,
param_map['PARAM-0045'] AS PARAM0045,
param_map['PARAM-0070'] AS PARAM0070
FROM
param_mapped_data
输出:
sl
param0040
param0045
param0070
1
PASS
PASS
PASS
2
FAIL
FAIL
PASS
我们在需要进一步解析的一列中接收数据。在此示例中,分隔符是 ~。 目标是从其各自的对中获取通过或失败值。
SL | 数据 |
---|---|
1 | “PARAM-0040,PASS~PARAM-0045,PASS~PARAM-0070,PASS” |
2 | "PARAM-0040,FAIL~PARAM-0045,FAIL~PARAM-0070,PASS" |
要求的结果:
SL | PARAM-0040 | PARAM-0045 | PARAM-0070 |
---|---|---|---|
1 | 通过 | 通过 | 通过 |
2 | 失败 | 失败 | 通过 |
这将是更大的 SQL 查询的一部分,我们将在其中选择许多其他列,这三列也将从源中提取并作为选定列传递到查询中。
例如
Select Column1, Column2, [ Parse code ] as PARAM-0040, [ Parse code ] as PARAM-0045, [ Parse code ] as PARAM-0070, Column6 .....
谢谢
您可以使用正则表达式来做到这一点。但是正则表达式是非标准的。 这是在 postgresql 中的实现方式:REGEXP_MATCHES()
https://www.postgresqltutorial.com/postgresql-regexp_matches/
在 postgresql 中 regexp_matches returns 零个或多个值。那么它必须被分解(因此 {})
一个更简单的方法,同样在 postgresql 中是使用子字符串。
子字符串('foobar' 来自 'o(.)b')
喜欢:
select substring('PARAM-0040,PASS~PARAM-0045,PASS~PARAM-0070,PASS' from 'PARAM-0040,([^~]+)~');
substring
-----------
PASS
(1 row)
您可以使用 str_to_map
函数来拆分数据,然后提取每个参数的值。此示例将首先将每个 param/value 对拆分为 ~
,然后再将参数和值拆分为 ,
。
您的示例数据的可重现示例:
WITH my_table AS (
SELECT 1 as SL, "PARAM-0040,PASS~PARAM-0045,PASS~PARAM-0070,PASS" as DATA
UNION ALL
SELECT 2 as SL, "PARAM-0040,FAIL~PARAM-0045,FAIL~PARAM-0070,PASS" as DATA
),
param_mapped_data AS (
SELECT SL, str_to_map(DATA,"~",",") param_map FROM my_table
)
SELECT
SL,
param_map['PARAM-0040'] AS PARAM0040,
param_map['PARAM-0045'] AS PARAM0045,
param_map['PARAM-0070'] AS PARAM0070
FROM
param_mapped_data
假设您的 table 的实际代码被命名为 my_table
WITH param_mapped_data AS (
SELECT SL, str_to_map(DATA,"~",",") param_map FROM my_table
)
SELECT
SL,
param_map['PARAM-0040'] AS PARAM0040,
param_map['PARAM-0045'] AS PARAM0045,
param_map['PARAM-0070'] AS PARAM0070
FROM
param_mapped_data
输出:
sl | param0040 | param0045 | param0070 |
---|---|---|---|
1 | PASS | PASS | PASS |
2 | FAIL | FAIL | PASS |