【发布时间】:2021-06-20 23:15:48
【问题描述】:
各位开发者大家好,
我正在开发一个 Oracle DB,并且有一些 XML 数据以 blob 格式存储, XML 有:
a) 公式(例如 %1 - %2 或 %2||'-'||%1)
b) 适合公式的变量的分隔列表(例如 SALE_Q1| SALE_Q2 或 YEAR| MONTH)
我已经设法将这些数据提取到 2 个不同的列中(如果需要也可以合并到 1 个列中),我需要做的是将输出列作为变量叠加到占位符上。
(例如 SALE_Q1 - SALE_Q2 或 MONTH||'-'||YEAR)
还有一些注意事项,例如:
- 我不知道每个公式会有多少个变量,
- 变量在公式中的使用顺序与分隔列表的顺序不同(参见示例 2)
我们可以考虑来自如下查询的数据:SELECT formula || ', ' || columns_used FROM data_table; 用于输入字符串
我目前得到的输出是这样的:
%1||'-'||%2||%3, SITE_NO| SITE_NAME| COUNTRY
0.1 * %1, WIND_RES
%1, TOTAL
CASE WHEN LENGTH(%1) < 8 THEN NULL ELSE TO_DATE(%1,'yyyymmdd')END, MIN_DATE
%1(+)=%3 and %2(+)=%4, ABC| LMN| PQR| XYZ
我对 SQL 很陌生,这个要求超出了我的想象,任何帮助将不胜感激。我需要一个 SQL 解决方案,因为 PL/SQL 解决方案在我的要求中不可行(此脚本将从一个数据库中提取数据并定期将其提供给另一个存储库)
我看过一些关于 XML 表、模型或递归正则表达式的文章,但我不确定如何使用它们。我还在 StackOverflow 上看到了this question,但我的要求与此有点不同,而且也有点棘手。将公式字符串和变量放入同一个字符串中以便像该问题一样进行处理也是一种可行的方法。任何可以写在 SQL 查询中的解决方案都会很有帮助。
更多示例供您参考:
"%1||'-'||%2||%3, SITE_NO| SITE_NAME| COUNTRY" => "SITE_NO||'-'||SITE_NAME||COUNTRY"
"0.1 * %1, WIND_RES" => "0.1 * WIND_RES"
"%1, TOTAL" => "TOTAL"
"CASE WHEN LENGTH(%1) < 8 THEN NULL ELSE TO_DATE(%1,'yyyymmdd')END, MIN_DATE" => "CASE WHEN LENGTH(MIN_DATE) < 8 THEN NULL ELSE TO_DATE(MIN_DATE,'yyyymmdd')END"
"%1(+)=%3 and %2(+)=%4, ABC| LMN| PQR| XYZ" => "ABC(+)=PQR and LMN(+)=XYZ"
【问题讨论】:
-
您似乎正在构建将构建动态 SQL 的东西;这看起来像是使您的代码易受 SQL 注入攻击的秘诀,而且几乎可以肯定这不是您想要放入生产系统的东西。此外,您的最后一个示例看起来非常像您使用 Oracle 的旧逗号连接语法;请迁移到使用 ANSI 连接。
-
另外,您似乎使用
||作为字符串连接运算符,|作为您的分隔符。有什么逻辑可以确保|字符保留其适当的含义?是不是逗号前的|是连接运算符,而逗号后的|总是分隔符?你能确保永远不会有两个逗号吗? -
@MT0 脚本不会暴露给任何客户端并且数据输入不是来自事务数据库,这是一个脚本是系统的一部分,用于获取大量聚合数据到数据库进行分析。公式来自报告工具,因此 sntax 看起来很旧(我无法更改)。但是我可以更改分隔符,所有建议都可用“、”或“|” “/”或您可以建议的任何符号
-
@MT0,输入字符串和变量列表也可以用作 2 个不同的列,如果这样可以更轻松地完成任务
标签: sql oracle replace oracle11g