【问题标题】:Using COALESCE correctly in WHERE clause在 WHERE 子句中正确使用 COALESCE
【发布时间】:2020-07-26 05:13:28
【问题描述】:

鉴于以下条件,有人可以解释为什么在 where 子句中合并不起作用吗?在这种情况下,我们如何正确使用合并,而不更改以下合并条件,并且仅用于 Spoiled = Y?

餐桌水果:

  ITEM_NAME     ITEM_NO     SPOILED
  Apples        A15354        N 
  Bananas       BYHUG1        N
  Grapes        GR0013        Y     
  Oranges       ORULYE        N
  Guavas        GUOIUW        Y

查询:

  select fruit.item_name
  from fruit
  where fruit.item_no = coalesce('A15354','CURR_NOT_IN_TABLE','GR0013','GUOIUW')
  and fruit.spoiled = 'Y'

使用上面的查询不会返回任何内容。期望的输出应该是葡萄。

期望的输出:

  Grapes

【问题讨论】:

  • 你想做什么?把你的问题说清楚

标签: sql oracle plsql where-clause coalesce


【解决方案1】:

我们可以在这里使用ROW_NUMBER 来选择您想要的优先级:

WITH cte AS (
    SELECT f.*, ROW_NUMBER() OVER (ORDER BY DECODE(ITEM_NO, 'A15354', 1,
                                                            'CURR_NOT_IN_TABLE', 2,
                                                            'GR0013', 3,
                                                            'GUOIUW', 4, 5)) rn
    FROM fruit f
    WHERE spoiled = 'Y'
)

SELECT ITEM_NAME
FROM cte
WHERE rn = 1;

这里的想法是为每个被破坏的项目分配一个从 1 到 5 的优先级。我们使用ROW_NUMBER 来生成一个序列,该序列始终以 1 为最高可用优先级。

【讨论】:

    【解决方案2】:

    虽然@Tim Biegeleisen 给出了如何解决业务问题的完美答案,但它没有回答 OP 的问题。 COALESCE 将返回参数列表中的第一个 NOT NULL 值。如果您像这样传递 nr 个字符串,则该值将始终是第一个。通常你传递一个列作为参数,它会返回第一个 NOT NULL 列值

    最好的学习方法是反复练习查询和测试

    with fruit (ITEM_NAME,ITEM_NO,SPOILED)
    AS
    (
    SELECT 'Apples',   'A15354','N' FROM DUAL UNION 
    SELECT 'Bananas',  'BYHUG1','N' FROM DUAL UNION
    SELECT 'Grapes',   'GR0013','Y' FROM DUAL UNION     
    SELECT 'Oranges',  'ORULYE','N' FROM DUAL UNION
    SELECT 'Guavas',   'GUOIUW','Y' FROM DUAL 
    )
    select fruit.item_name
      from fruit
      where fruit.item_no = COALESCE('A15354','CURR_NOT_IN_TABLE','GR0013','GUOIUW')
    
    Apples
    

    那是因为COALESCE 调用只返回“A15354”。另一种测试它的方法是将该语句包含在您的 SELECT 中,如下所示:

    with fruit (ITEM_NAME,ITEM_NO,SPOILED)
    AS
    (
    SELECT 'Apples',   'A15354','N' FROM DUAL UNION 
    SELECT 'Bananas',  'BYHUG1','N' FROM DUAL UNION
    SELECT 'Grapes',   'GR0013','Y' FROM DUAL UNION     
    SELECT 'Oranges',  'ORULYE','N' FROM DUAL UNION
    SELECT 'Guavas',   'GUOIUW','Y' FROM DUAL 
    )
    select 
       fruit.item_name
     , COALESCE('A15354','CURR_NOT_IN_TABLE','GR0013','GUOIUW')
      from fruit
    
    ITEM_NA COALES
    ------- ------
    Apples  A15354
    Bananas A15354
    Grapes  A15354
    Guavas  A15354
    Oranges A15354
    

    如您所见,它为每一行返回相同的值,只是因为第一个 NOT NULL 值是字符串 A15354。

    COALESCE 不能解决你的问题,我希望这能解释一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      相关资源
      最近更新 更多