为什么COALESCE对于单个列返回多个“无效列名”错误?

希金斯

使用编写SQL查询时COALESCE,我注意到在特定情况下,对于一个无效的列名,它将引发多个错误。

如果我编写以下查询并尝试执行该查询,简而言之,我会收到一条错误消息,告诉我我是个白痴,并且该列不存在。

DECLARE @a TABLE (Column1 INT, Column2 INT)

-- This will return one error, complaining about NeverHeardOfIt
SELECT 
    COALESCE
      (
        Column1, 
        Column2, 
        NeverHeardOfIt
      ) 
FROM @a

消息207,级别16,状态1,第8行无效的列名'NeverHeardOfIt'。

但是,如果我稍稍更改查询以将无效列放在COALESCE语句的前面,则会收到两个错误:

DECLARE @a TABLE (Column1 INT, Column2 INT)

-- This will return two errors, both complaining about NeverHeardOfIt
SELECT 
    COALESCE
      (
        Column1, 
        NeverHeardOfIt, 
        Column2
      ) 
FROM @a 

消息207,级别16,状态1,第7行无效的列名称'NeverHeardOfIt'。

消息207,级别16,状态1,第7行无效的列名称'NeverHeardOfIt'。

我已经测试了几种不同的方案,并且似乎只有在我合并三个或更多列且无效列不是最后一列时才会发生。显然,“修复”很容易-不要引用无效的列!但是我很好奇,为什么COALESCE()函数会两次抛出相同的错误呢?我所能想到的最好的是,在幕后,SQL正在编写多个语句,这些语句大致如下:

如果列1为NULL,请使用NeverHeardOfIt

如果NeverHeardOfIt为NULL,则使用Column2

如果Column2为NULL ...

如果是这样的话,那么当我执行它时,我可以看到该函数将如何/为什么为幕后生成的每个“语句”返回错误。

有谁知道这是正确的,还是知道另一个原因会返回两个错误?

戈登·利诺夫

我认为双重错误消息是一个错误,但是很小。但是,原因是coalesce()choose()以及)确实是简写。所以:

coalesce(a, b, c)

是真的:

(case when a is not null then a
      when b is not null then b
      else c
 end)

请注意,最后一个元素仅出现一次-因此,当缺少的列位于末尾时,只会出现一个错误。

这看起来像是一个神秘的细节,但实际上很重要。例如,如果值之一是子查询-并且子查询的运行可能很昂贵-则在的评估中它将运行两次coalesce()如果性能是一个问题,并且一个或多个值是子查询,那么即使我更喜欢isnull()在这些情况下其性能也更好。通常,我偏向使用ANSI标准函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SelectField:为什么返回“无效选择错误”?

来自分类Dev

SelectField:为什么返回“无效选择错误”?

来自分类Dev

SelectField:为什么返回“无效选择错误”?

来自分类Dev

SelectField:为什么返回“无效选择错误”?

来自分类Dev

(为什么?)Greatest + Coalesce的方式比使用或的单个选择要快

来自分类Dev

为什么两次使用临时表时都会收到无效的列名错误?

来自分类Dev

为什么Scipy的ndimage.map_coordinates对于某些数组不返回任何值或错误的结果?

来自分类Dev

为什么get_linesize()对于.fon字体错误地返回1?

来自分类Dev

为什么 R 中的 coalesce() 会为我返回额外的值?

来自分类Dev

为什么 REGEXEXTRACT 在预期返回 1 行多列的数组时返回单个值?

来自分类Dev

对于无效的QModelIndex,重载的QAbstractItemModel :: flags应该返回什么?

来自分类Dev

为什么NSIndexPath indexPathForItem返回无效路径?

来自分类Dev

为什么我的方法返回无效?

来自分类Dev

为什么jquery返回无效的属性值?

来自分类Dev

为什么在Ruby中将“ return a or b”返回为无效值表达式错误?

来自分类Dev

为什么当我添加 POLLHUP 作为事件时,WSAPoll 返回错误(无效参数)?

来自分类Dev

为什么我会从多个“if”语句中得到“无效的左侧赋值”错误?

来自分类Dev

为什么这不返回错误?

来自分类Dev

为什么sidekiq返回错误?

来自分类Dev

错误:无效的列名

来自分类Dev

为什么选择单个属性返回的行少于选择Oracle SQL中的所有列的行

来自分类Dev

为什么numpy.prod()对于一长串自然数会错误地返回负数或0?

来自分类Dev

对于@SpringBootTest,为什么我没有一个告诉我“配置错误:发现@BootstrapWith的多个声明”?

来自分类Dev

为什么会出现“从“无效*”到“ int **”的无效转换错误?

来自分类Dev

where子句中的列别名给出无效的列名错误

来自分类Dev

为什么对于具有2个元素的元组,长度返回1,而对于具有更多元素的元组,则给出错误?

来自分类Dev

为什么CROSS APPLY * not *在此查询中没有得到无效的列错误?

来自分类Dev

为什么tellp()对于ios :: app返回0,而对于ios :: ate不返回0?

来自分类Dev

为什么错误方法返回错误?

Related 相关文章

  1. 1

    SelectField:为什么返回“无效选择错误”?

  2. 2

    SelectField:为什么返回“无效选择错误”?

  3. 3

    SelectField:为什么返回“无效选择错误”?

  4. 4

    SelectField:为什么返回“无效选择错误”?

  5. 5

    (为什么?)Greatest + Coalesce的方式比使用或的单个选择要快

  6. 6

    为什么两次使用临时表时都会收到无效的列名错误?

  7. 7

    为什么Scipy的ndimage.map_coordinates对于某些数组不返回任何值或错误的结果?

  8. 8

    为什么get_linesize()对于.fon字体错误地返回1?

  9. 9

    为什么 R 中的 coalesce() 会为我返回额外的值?

  10. 10

    为什么 REGEXEXTRACT 在预期返回 1 行多列的数组时返回单个值?

  11. 11

    对于无效的QModelIndex,重载的QAbstractItemModel :: flags应该返回什么?

  12. 12

    为什么NSIndexPath indexPathForItem返回无效路径?

  13. 13

    为什么我的方法返回无效?

  14. 14

    为什么jquery返回无效的属性值?

  15. 15

    为什么在Ruby中将“ return a or b”返回为无效值表达式错误?

  16. 16

    为什么当我添加 POLLHUP 作为事件时,WSAPoll 返回错误(无效参数)?

  17. 17

    为什么我会从多个“if”语句中得到“无效的左侧赋值”错误?

  18. 18

    为什么这不返回错误?

  19. 19

    为什么sidekiq返回错误?

  20. 20

    错误:无效的列名

  21. 21

    为什么选择单个属性返回的行少于选择Oracle SQL中的所有列的行

  22. 22

    为什么numpy.prod()对于一长串自然数会错误地返回负数或0?

  23. 23

    对于@SpringBootTest,为什么我没有一个告诉我“配置错误:发现@BootstrapWith的多个声明”?

  24. 24

    为什么会出现“从“无效*”到“ int **”的无效转换错误?

  25. 25

    where子句中的列别名给出无效的列名错误

  26. 26

    为什么对于具有2个元素的元组,长度返回1,而对于具有更多元素的元组,则给出错误?

  27. 27

    为什么CROSS APPLY * not *在此查询中没有得到无效的列错误?

  28. 28

    为什么tellp()对于ios :: app返回0,而对于ios :: ate不返回0?

  29. 29

    为什么错误方法返回错误?

热门标签

归档