Oracle 12c - 使用表中的值构建选择语句

Posted

技术标签:

【中文标题】Oracle 12c - 使用表中的值构建选择语句【英文标题】:Oracle 12c - Build select statements using values from a table 【发布时间】:2014-05-30 21:47:38 【问题描述】:

我有一个复杂的需求,但我会尽量保持简单,并用我的大脑来解决满足我基本需求的答案。

我有一个表 TABLE1,有 2 列,ID(INTEGER)LVL_CNT(INTEGER)CLOB_COLUMN(CLOB)CLOB_COLUMN 会有一个 select 语句。以下是每列中的值以显示示例。

ID = 1 LVL_CNT = 10 CLOB_COLUMN 将有如下脚本:

SELECT     'ID',
           'Name',
           'Description',
           'Group',
           'Level Count',
           'Usage',
           'Snapshot Date',
           'Conformed Hierarchy',
           'Level Name:',
           'Level Name:',
           'Level Name:',
           'Level Name:',
           'Level Name:',
           'Level Name:',
           'Level Name:',
           'Level Name:',
           'Level Name:',
           'Level Name:
FROM dual;

目前,我正在手动编写 CLOB 脚本,但我想自动构建它以避免为所有记录编写它。 “'Level Name:'”被迭代 10 次,因为 LVL_CNT = 10。如果 LVL_CNT = 5,则迭代“'Level Name:'”5 次。我怎样才能做到这一点?

【问题讨论】:

如果您希望查询返回可变数量的列,那么您只能使用动态 SQL 来实现。常规 SQL 选择语句具有固定数量的列。 【参考方案1】:
Select rpad('level name:', lvl_cnt*length('level name:'), 'level name:') 
from yourtable

应该给你 'level name:level name:level name:level name:' for lvl_cnt=4


使用 (level name1: level name2:...) 跟进任务

有一个简单但不可扩展的解决方案。如果你知道你的最大 lv_cnt 并且它不是很大 [ max varcahr2 2000 / length('level name001') = 142] (示例高达 lvl_cnt = 4):

 select susbtr(
 rpad(
 rpad(
 rpad('level name1:', 
 2*length('level name1:'), 'level name2:'),
 3*length('level name1:'), 'level name3:'),
 4*length('level name1:'), 'level name4:'),
 1, lvl_cnt*length('level name1:')
 from dual

超过 10、100、.. 时逻辑会很复杂,因为它会影响整体长度,但您可以将格式更改为 'level name001:' 并保持简单:)。

...但如果你仔细想想,它就像预构建字符串

select substr('level name1:level name2:level name3:level name4:', 1, lvl_cnt*12) 
from dual

【讨论】:

如何使用这种方法为每次迭代添加一个数字? IE。 Level Name1:, Level Name2:, Level Name 3 for lvl_cnt=3. 你不能。你需要一种不同的方法。以下是您需要解决的任务: 1. 生成数字列表(转储版本:'select rownum from all_objects where rownum 我会在答案中添加一个带有 rpad 的案例,但它不可扩展

以上是关于Oracle 12c - 使用表中的值构建选择语句的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 12c - 使用另一个表中的值在表中插入值

Oracle 12c - 插入到选择查询中的不明确列,ORA-00918

使用 Oracle 子选择替换 CASE 语句

Oracle 12c 中的子选择性能不佳

oracle语句,我想查询A表中的a字段下的值不等于B表中b的值的数据,

Oracle 12c怎么创建表啊,今天刚装的,啥都不懂,求各位大神指教!!1