我有两个表,它们通过公共列“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 | 今天下雨,天空阴沉。 |
我试图寻找解决方案,但没有运气,或者也许我没有正确搜索。
将替换值分成单独的项,然后对每个值使用
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 | 今天下雨,天空阴沉。 |