返回某些IN条件不匹配的默认值

时间:2020-03-02 08:37:18

标签: sql oracle

我认为这并不难。我正在编写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的地方。

有什么简单的方法可以对结果进行编码? 非常感谢!

3 个答案:

答案 0 :(得分:3)

COALESCENVLCASELEFT 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 )

答案 1 :(得分:2)

您可以将LEFT JOINUNION 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;

答案 2 :(得分:0)

如果这对您有用:

scope :currently_open, -> { "use Store#currently_open? here" }