Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在WHERE子句中正确使用COALESCE_Sql_Oracle_Plsql_Where Clause_Coalesce - Fatal编程技术网

Sql 在WHERE子句中正确使用COALESCE

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

如果满足以下条件,有人能解释为什么在where子句中coalesce不起作用吗?在这种情况下,我们如何在不改变以下聚结条件的情况下正确使用聚结,并且仅针对损坏的=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
我们可以在此处使用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


联合不是解决您问题的方法,我希望这能解释一下。

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