使用 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