在where子句中正确使用coalesce

ndasle7k  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(660)

有人能解释为什么在下面的条件下,coalesce在where子句中不起作用吗?在这种情况下,如何在不改变以下合并条件的情况下正确使用coalesce,并且仅针对sparted=y?
餐桌水果:

  1. ITEM_NAME ITEM_NO SPOILED
  2. Apples A15354 N
  3. Bananas BYHUG1 N
  4. Grapes GR0013 Y
  5. Oranges ORULYE N
  6. Guavas GUOIUW Y

查询:

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

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

  1. Grapes
kuhbmx9i

kuhbmx9i1#

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

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

这里的想法是为每个损坏的项目分配一个从1到5的优先级。我们使用 ROW_NUMBER 生成总是以1作为最高可用优先级开始的序列。

uttx8gqw

uttx8gqw2#

尽管@tim biegeleisen给出了一个关于如何解决业务问题的完美答案,但它并没有回答op提出的问题。 COALESCE 将返回参数列表中的第一个not null值。如果像这样传递nr个字符串,则值始终是第一个。通常将列作为参数传递,它将返回第一个not null列值
最好的学习方法是反复使用查询和测试

  1. with fruit (ITEM_NAME,ITEM_NO,SPOILED)
  2. AS
  3. (
  4. SELECT 'Apples', 'A15354','N' FROM DUAL UNION
  5. SELECT 'Bananas', 'BYHUG1','N' FROM DUAL UNION
  6. SELECT 'Grapes', 'GR0013','Y' FROM DUAL UNION
  7. SELECT 'Oranges', 'ORULYE','N' FROM DUAL UNION
  8. SELECT 'Guavas', 'GUOIUW','Y' FROM DUAL
  9. )
  10. select fruit.item_name
  11. from fruit
  12. where fruit.item_no = COALESCE('A15354','CURR_NOT_IN_TABLE','GR0013','GUOIUW')
  13. Apples

那是因为 COALESCE call only返回'a15354'。另一种测试方法是在select中包含该语句,如下所示:

  1. with fruit (ITEM_NAME,ITEM_NO,SPOILED)
  2. AS
  3. (
  4. SELECT 'Apples', 'A15354','N' FROM DUAL UNION
  5. SELECT 'Bananas', 'BYHUG1','N' FROM DUAL UNION
  6. SELECT 'Grapes', 'GR0013','Y' FROM DUAL UNION
  7. SELECT 'Oranges', 'ORULYE','N' FROM DUAL UNION
  8. SELECT 'Guavas', 'GUOIUW','Y' FROM DUAL
  9. )
  10. select
  11. fruit.item_name
  12. , COALESCE('A15354','CURR_NOT_IN_TABLE','GR0013','GUOIUW')
  13. from fruit
  14. ITEM_NA COALES
  15. ------- ------
  16. Apples A15354
  17. Bananas A15354
  18. Grapes A15354
  19. Guavas A15354
  20. Oranges A15354

如您所见,它为每一行返回相同的值,这仅仅是因为第一个notnull值是字符串a15354。 COALESCE 不是解决你问题的办法,我希望这能解释一下。

展开查看全部

相关问题