小编典典

元编程Oracle SQL Select语句

sql

假设我有一个类似以下的查询:

SELECT
  CASE WHEN ONE = 1 THEN 1 ELSE 0 END,
  CASE WHEN JUST_ONE = 1 THEN 1 ELSE 0 END,
  CASE WHEN ANOTHER_ONE = 1 THEN 1 ELSE 0 END,

  CASE WHEN TWO = 1 THEN 1 ELSE 0 END,
  CASE WHEN JUST_TWO = 1 THEN 1 ELSE 0 END,
  CASE WHEN ANOTHER_TWO = 1 THEN 1 ELSE 0 END

  -- 20 more things like that where changes only columns name
FROM
  SOME_TABLE;

如您所见,这两组之间的唯一区别是,在第一组中,我使用具有“ ONE”的列,在第二组中,具有“
TWO”的列,在我的实际查询中,我大约有30个这样的组,因此我想知道是否有某种方法可以缩短它?


阅读 216

收藏
2021-04-28

共1个答案

小编典典

由于它们是不同的列,因此必须在SELECT列表中分别明确提及它们。您不能在纯 SQL中 动态地执行此操作。

我建议使用一个好的 文本编辑器 ,几乎不需要一两分钟就能编写出整个SQL。

您可以使用 DECODE 语法少一些,而不要使用冗长的 CASE 表达式。

例如,

  DECODE(ONE, 1, 1, 0) AS col1, 
  DECODE(JUST_ONE, 1, 1, 0) AS col2,
  DECODE(ANOTHER_ONE, 1, 1, 0) AS col3,
  DECODE(TWO, 1, 1, 0) AS col4,
  DECODE(JUST_TWO, 1, 1, 0) AS col5,
  DECODE(ANOTHER_TWO, 1, 1, 0) as col6

我建议坚持使用 SQL ,而不要使用 PL / SQL 。它们不一样,它们是不同的引擎。PL --> Procedural Language

但是,如果您坚持要使用,则可以使用 游标进行循环, 以遍历[ DBA | ALL | USER] _TAB_COLS中的 所有列。您可以使用
SYS_REFCURSOR 来查看数据。首先,您必须构建 动态SQL

2021-04-28