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 - 插入到选择查询中的不明确列,ORA-00918