如何解析Oracle中的数据?

问题描述 投票:0回答:1

我有两个表,它们通过公共列“ID”链接。表 1 包含填充空格的文本 (%1,%2,... %10),表 2 包含由 / 分隔符分隔的这些空格的值。

预期结果是填空并显示完整的句子作为选择语句和/或通过创建函数。

非常感谢任何帮助!!!

注意: 甲骨文版本:11g。 Table1 最多可以填充 10 个值 (%10)

表1:

身份证 文字
1 今天 %1,天空 %2。
2 今天是 %1,有 %2,机会是 %3。
3 我只有 %1 有一个 %3 能理解的 %2。我们%4需要%5到%6。

表2:

代码 身份证 价值观
A1 1 晴朗/亮蓝色
A2 2 下雨/严重雷暴/洪水
A3 3 可能/问题/你会/所有人/某人/精益
A4 1 下雨/天黑

预期输出:

代码 输出文本
A1 今天天气晴朗,天空蔚蓝。
A2 今天有雨,有严重雷暴,并有可能发生洪水。
A3 我可能有一个你会理解的问题。我们都需要有人依靠。
A4 今天下雨,天空阴沉。

我试图寻找解决方案,但没有运气,或者也许我没有正确搜索。

oracle function parsing
1个回答
0
投票

将替换值分成单独的项,然后对每个值使用

REPLACE
(替换
%10
之前的
%1
):

WITH bounds (id, v, b1, b2, b3, b4, b5, b6, b7, b8, b9) AS (
  SELECT id,
         vals,
         INSTR(vals, '/', 1, 1),
         INSTR(vals, '/', 1, 2),
         INSTR(vals, '/', 1, 3),
         INSTR(vals, '/', 1, 4),
         INSTR(vals, '/', 1, 5),
         INSTR(vals, '/', 1, 6),
         INSTR(vals, '/', 1, 7),
         INSTR(vals, '/', 1, 8),
         INSTR(vals, '/', 1, 9)
  FROM   table2
),
terms (id, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) AS (
  SELECT id,
         CASE
         WHEN b1 = 0 THEN v
         ELSE SUBSTR(v, 1, b1 - 1)
         END,
         CASE
         WHEN b2 = 0 AND b1 > 0 THEN SUBSTR(v, b1 + 1)
         WHEN b2 > 0 AND b1 > 0 THEN SUBSTR(v, b1 + 1, b2 - b1 - 1)
         END,
         CASE
         WHEN b3 = 0 AND b2 > 0 THEN SUBSTR(v, b2 + 1)
         WHEN b3 > 0 AND b2 > 0 THEN SUBSTR(v, b2 + 1, b3 - b2 - 1)
         END,
         CASE
         WHEN b4 = 0 AND b3 > 0 THEN SUBSTR(v, b3 + 1)
         WHEN b4 > 0 AND b3 > 0 THEN SUBSTR(v, b3 + 1, b4 - b3 - 1)
         END,
         CASE
         WHEN b5 = 0 AND b4 > 0 THEN SUBSTR(v, b4 + 1)
         WHEN b5 > 0 AND b4 > 0 THEN SUBSTR(v, b4 + 1, b5 - b4 - 1)
         END,
         CASE
         WHEN b6 = 0 AND b5 > 0 THEN SUBSTR(v, b5 + 1)
         WHEN b6 > 0 AND b5 > 0 THEN SUBSTR(v, b5 + 1, b6 - b5 - 1)
         END,
         CASE
         WHEN b7 = 0 AND b6 > 0 THEN SUBSTR(v, b6 + 1)
         WHEN b7 > 0 AND b6 > 0 THEN SUBSTR(v, b6 + 1, b7 - b6 - 1)
         END,
         CASE
         WHEN b8 = 0 AND b7 > 0 THEN SUBSTR(v, b7 + 1)
         WHEN b8 > 0 AND b7 > 0 THEN SUBSTR(v, b7 + 1, b8 - b7 - 1)
         END,
         CASE
         WHEN b9 = 0 AND b8 > 0 THEN SUBSTR(v, b8 + 1)
         WHEN b9 > 0 AND b8 > 0 THEN SUBSTR(v, b8 + 1, b9 - b8 - 1)
         END,
         CASE
         WHEN b9 > 0 THEN SUBSTR(v, b9 + 1)
         END
  FROM   bounds
)
SELECT t1.id,
       REPLACE(
         REPLACE(
           REPLACE(
             REPLACE(
               REPLACE(
                 REPLACE(
                   REPLACE(
                     REPLACE(
                       REPLACE(
                         REPLACE(text, '%10', t10),
                         '%9', t9
                       ),
                       '%8', t8
                     ),
                     '%7', t7
                   ),
                   '%6', t6
                 ),
                 '%5', t5
               ),
               '%4', t4
             ),
             '%3', t3
           ),
           '%2', t2
         ),
         '%1', t1
       ) AS replaced
FROM   table1 t1
       INNER JOIN terms t
       ON t1.id = t.id

对于样本数据:

CREATE TABLE table1 (ID, TEXT) AS
SELECT 1, 'It is %1 today with a %2 sky.' FROM DUAL UNION ALL
SELECT 2, 'It is %1 today with %2 and chances of %3.' FROM DUAL UNION ALL
SELECT 3, 'I just %1 have a %2 that %3 understand. We %4 need %5 to %6 on.' FROM DUAL;

CREATE TABLE Table2 (ID, VALS) AS
SELECT 1, 'sunny/bright blue' FROM DUAL UNION ALL
SELECT 2, 'rainy/severe thunder storms/flooding' FROM DUAL UNION ALL
SELECT 3, 'might/problem/you''ll/all/somebody/lean' FROM DUAL UNION ALL
SELECT 1, 'rainy/gloomy' FROM DUAL;

输出:

身份证 已更换
1 今天天气晴朗,天空蔚蓝。
2 今天有雨,有严重雷暴,并有可能发生洪水。
3 我可能有一个你会理解的问题。我们都需要有人依靠。
1 今天下雨,天空阴沉。

小提琴

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