检查单行中是否存在Oracle表的列名

v9tzhpje  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(104)

这个问题和here的问题基本相同
我想在一个单一的行,而不是多行输出。如果表中存在列,则输出1,否则输出0。我如何才能做到这一点?
如属下表的情况─

CREATE TABLE orders
    ( 
       id           NUMBER(10),
      order_mode     VARCHAR2(8),
      cust_id        NUMBER(6),
      status       NUMBER(2)
   )

预期产出-

ID, ORDER_MODE, SOME_COL
1, 1, 0

ID, ORDER_MODE, SOME_COL
Yes, Yes, No

更新

这个问题与我上面描述的相同,但需要不同格式的输出。在上面的问题(here)中发布的答案提供了两列格式的输出,其中第一列具有列名,另一列包含特定列是否存在。
在这个问题中,输出需要在单行中,而不是多行中。在我看来,这两个问题的解决方案将是不同的。
下面是Littlefoot's问题的答案。
“if column exists”的意思是知道特定的列是否属于表。根据预期的输出,如果表中不存在“SOME_COL”,我想在对表执行其他查询之前知道。如果提供了错误的列名,另一个查询可能会失败。

bq3bfh9z

bq3bfh9z1#

您可以用途:

SELECT CASE
       WHEN EXISTS(
              SELECT 1
              FROM   all_tab_columns
              WHERE  table_name  = 'ORDERS'
              AND    column_name = 'ID'
            )
       THEN 'Yes'
       ELSE 'No'
       END AS id,
       CASE
       WHEN EXISTS(
              SELECT 1
              FROM   all_tab_columns
              WHERE  table_name  = 'ORDERS'
              AND    column_name = 'ORDER_MODE'
            )
       THEN 'Yes'
       ELSE 'No'
       END AS order_mode,
       CASE
       WHEN EXISTS(
              SELECT 1
              FROM   all_tab_columns
              WHERE  table_name  = 'ORDERS'
              AND    column_name = 'SOME_COL'
            )
       THEN 'Yes'
       ELSE 'No'
       END AS some_col
FROM   DUAL;

或:

WITH columns (column_name) AS (
  SELECT 'ID'         FROM DUAL UNION ALL
  SELECT 'ORDER_MODE' FROM DUAL UNION ALL
  SELECT 'SOME_COL'   FROM DUAL
),
column_exists (column_name, column_exists) AS (
  SELECT c.column_name,
         NVL2(a.column_name, 'YES', 'NO')
  FROM   columns c
         LEFT OUTER JOIN all_tab_columns a
         ON (a.table_name = 'ORDERS' AND a.column_name = c.column_name)
)
SELECT *
FROM   column_exists
       PIVOT (
         MAX(column_exists)
         FOR column_name IN (
           'ID' AS id,
           'ORDER_MODE' AS order_mode,
           'SOME_COL' AS some__col
         )
       )

这两个输出:
| ID|订单模式|某些_COL|
| - -----|- -----|- -----|
| 是的|是的|没有|
fiddle

相关问题