sql - 元编程oracle sql select语句

标签 sql oracle

假设我有一个如下查询:

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 个这样的组实际查询所以我想知道是否有办法以某种方式缩短它?

最佳答案

由于它们是不同的列,因此您必须在 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 --> 过程语言

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

关于sql - 元编程oracle sql select语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35058934/

相关文章:

mysql - 错误 1452 : Cannot add or update a child row: a foreign key constraint fails

sql - Oracle 存储过程中的临时表

SQL ORACLE - 查找连续天数

sql - 列出一名员工的所有列(dept、emp、salgrade)

sql - Oracle-返回一组行中的最短字符串值

sql - INNER JOIN 和 , COMMA 的区别

android - 为什么我的 SQL 服务器不能正常工作(android SDK)?

php - MYSQL如何控制每条记录的最大行数?

sql - 具有不同数据类型的案例语句

sql - 从空表中删除永远