在 Oracle SQL 中使用 REGEXP_SUBSTR 分割字符串出错了

问题描述 投票:0回答:1
Hello i have 3 strings that i want to split and they are all separated with delimiter

string_1 contains names of fields for example: ID, DUE_DATE
string_2 contains values of fields for example: 80781,2026-12-01
string_3 contains types of fields for example:  VARCHAR2,DATE
string_4 contains format of fields for example:  yyyy-mm-dd (for date field)

所以我提出了这个问题

                with params as (
                  select  'ID|DUE_DATE'         as v_names
                         ,'80781|2026-12-01'    as v_values
                         ,'VARCHAR2|DATE'       as v_types
                         ,'|yyyy-mm-dd'         as v_types_format
                         ,'|' as v_delimiter
                  from dual
                )
                SELECT
                   REGEXP_SUBSTR(v_names, '[^ '||v_delimiter||']+', 1, level) AS v_name
                  ,REGEXP_SUBSTR(v_values, '[^ '||v_delimiter||']+', 1, level) AS v_value
                  ,REGEXP_SUBSTR(v_types, '[^ '||v_delimiter||']+', 1, level) AS v_type
                  ,REGEXP_SUBSTR(v_types_format, '[^ '||v_delimiter||']+', 1, level) as v_format
                FROM params
                CONNECT BY REGEXP_SUBSTR(v_names, '[^ '||v_delimiter||']+', 1, level) IS NOT NULL

我想得到这个结果(v_types_format 字符串应该为 ID 带来 null,为 DUE_DATE 带来 yyyy-mm-dd

但是我得到了这个结果

oracle plsql oracle19c regexp-substr
1个回答
0
投票

您没有匹配零宽度术语。

with params as (
  select  'ID|DUE_DATE'         as v_names
         ,'80781|2026-12-01'    as v_values
         ,'VARCHAR2|DATE'       as v_types
         ,'|yyyy-mm-dd'         as v_types_format
         ,'|' as v_delimiter
  from dual
)
SELECT REGEXP_SUBSTR(v_names, '(.*?)(['||v_delimiter||']|$)', 1, level, NULL, 1)
         AS v_name
      ,REGEXP_SUBSTR(v_values, '(.*?)(['||v_delimiter||']|$)', 1, level, NULL, 1)
         AS v_value
      ,REGEXP_SUBSTR(v_types, '(.*?)(['||v_delimiter||']|$)', 1, level, NULL, 1)
         AS v_type
      ,REGEXP_SUBSTR(v_types_format, '(.*?)(['||v_delimiter||']|$)', 1, level, NULL, 1)
         as v_format
FROM   params
CONNECT BY LEVEL < REGEXP_COUNT(v_names, '(.*?)(['||v_delimiter||']|$)')

输出:

V_NAME V_VALUE V_类型 V_格式
身份证 80781 VARCHAR2
DUE_DATE 2026-12-01 日期 年-月-日

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.