Sql 在WHERE子句中正确使用COALESCE
如果满足以下条件,有人能解释为什么在where子句中coalesce不起作用吗?在这种情况下,我们如何在不改变以下聚结条件的情况下正确使用聚结,并且仅针对损坏的=Y 食用水果:Sql 在WHERE子句中正确使用COALESCE,sql,oracle,plsql,where-clause,coalesce,Sql,Oracle,Plsql,Where Clause,Coalesce,如果满足以下条件,有人能解释为什么在where子句中coalesce不起作用吗?在这种情况下,我们如何在不改变以下聚结条件的情况下正确使用聚结,并且仅针对损坏的=Y 食用水果: ITEM_NAME ITEM_NO SPOILED Apples A15354 N Bananas BYHUG1 N Grapes GR0013 Y Oranges ORULYE
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
我们可以在此处使用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为最高可用优先级开始。我们可以在此处使用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作为最高可用优先级开始的序列。虽然@Tim Biegeleisen对如何解决业务问题给出了完美的答案,但它没有回答OP中的问题。COALESCE将返回参数列表中的第一个非空值。如果像这样传递nr个字符串,则该值将始终是第一个。通常将列作为参数传递,它将返回第一个NOTNULL列值 最好的学习方法是反复使用查询和测试
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
如您所见,它为每一行返回相同的值,这仅仅是因为第一个NOTNULL值是字符串A15354
COALESCE不是您问题的解决方案,我希望这能解释一下。虽然@Tim Biegeleisen对如何解决业务问题给出了完美的答案,但它没有回答OP中的问题。COALESCE将返回参数列表中的第一个非空值。如果像这样传递nr个字符串,则该值将始终是第一个。通常将列作为参数传递,它将返回第一个NOTNULL列值 最好的学习方法是反复使用查询和测试
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
如您所见,它为每一行返回相同的值,这仅仅是因为第一个NOTNULL值是字符串A15354
联合不是解决您问题的方法,我希望这能解释一下。您想做什么?把你的问题弄清楚你想做什么?把你的问题说清楚