1

我认为这应该不是很难。我正在编写一个 Oracle-SQL 代码来从 SQL 中提取数据:

select ID, Qty from TableOne where ID in ('A', 'B', 'C')

如果 IN 条件中的某些项目匹配,我希望数据库显示查询结果,如果 IN 条件中的这些项目不匹配,则返回默认值。例如,我希望结果是:

+----+-----------+
| ID |    Qty    |
+----+-----------+
| A  | 3         |
| A  | 5         |
| B  | 4         |
| C  | Not Found |
+----+-----------+

表 TableOne 中没有 ID = C 的地方。

有没有简单的方法来编码结果?非常感谢!

4

3 回答 3

3

使用COALESCE,NVLCASE与 aLEFT OUTER JOIN并在子查询因式分解子句中指定 id:

WITH ids_to_match( id ) AS (
  SELECT 'A' FROM DUAL UNION ALL
  SELECT 'B' FROM DUAL UNION ALL
  SELECT 'C' FROM DUAL
)
select i.ID,
       COALESCE( TO_CHAR(Qty), 'Not Found' ) AS Qty
from   ids_to_match i
       LEFT OUTER JOIN TableOne t
       ON ( t.id = i.id )

或使用集合和表集合表达式:

select i.COLUMN_VALUE AS ID,
       COALESCE( TO_CHAR(Qty), 'Not Found' ) AS Qty
from   TABLE( SYS.ODCIVARCHAR2LIST( 'A', 'B', 'C' ) ) i
       LEFT OUTER JOIN
       TableOne t
       ON ( t.id = i.COLUMN_VALUE )
于 2020-03-02T08:40:27.397 回答
2

您可以LEFT JOIN使用UNION ALL

WITH ALL_ID AS (
     SELECT 'A' AS ID FROM DUAL UNION ALL
     SELECT 'B' AS ID FROM DUAL UNION ALL
     SELECT 'C' AS ID FROM DUAL 
)
SELECT A.ID, t.Qty -- REPLACE NULL WITH NOT FOUND
FROM ALL_ID A ID LEFT JOIN
     Table t
      ON t.ID = A.ID;
于 2020-03-02T08:39:45.767 回答
0

如果这对您有用:

   select t2.ID, case when t2.QTY is NULL then TO_CHAR('Not found') else t2.QTY end "QTY" from TableOnet1 t1 right join Tabletwo t2
on t1.ID = t2.ID where t2.ID in ('A', 'B', 'C')
于 2020-03-02T09:01:41.423 回答