【问题标题】:Why do I get a SQL syntax error with this?为什么我会收到 SQL 语法错误?
【发布时间】:2014-01-27 23:03:40
【问题描述】:

尝试在 LINQPad 4 中运行此查询:

SELECT item_group_id as AccountID, IIF(ISNULL(t_item_group.description),'[blank]',t_item_group.description) AS Name 
FROM t_item_group 
WHERE active = TRUE

我明白了,“isnull 函数需要 2 个参数。

我尝试移动括号,将 "[blank]" 更改为 "[blank]" 和 "[blank]" ,但没有任何帮助...

LINQPad 出于这个原因无法运行的查询(我有两个类似的查询(使用 IIF(ISNULL)),但它们实际上(在我的 Web API 应用程序中)运行良好;所以,LINQPad 更“挑剔”也许比它需要的要多,但它在 SQL 语法方面有什么期望?

【问题讨论】:

  • 请不要在没有评论的情况下投反对票。如果这是重复的,请改为链接到原件。

标签: sql-server tsql linqpad isnull iif


【解决方案1】:

ISNULL 已经是一个 'if' 类型的语句了。

你可以替换

IIF(ISNULL(t_item_group.description),'[blank]',t_item_group.description)

ISNULL(t_item_group.description, '[blank]')

ISNULL 使用第一个参数(“描述”),除非该值为 null,在这种情况下它将使用第二个参数。


顺便说一句,我不关心ISNULL 的原因之一是它的名字很糟糕。您假设给定它的名称,它将返回一点 - 如果参数为 null,则返回 true,如果不为 null,则返回 false - 您可以像您尝试的那样在“if”语句中使用它。但这不是它的工作原理。

替代方法是使用COALESCE。它提供了几乎相同的功能,但命名是有意义的。

co·a·lesce ˌkōəˈles 动词 1. 聚在一起形成一个整体。

COALESCE 两个参数是强制他们变成一个不可为空的结果。而且功能其实更强大,可以提供多个参数——COALESCE(i.description, i.name, '[blank]')完全有效。

【讨论】:

  • ISNULLCOALESCE 之间的差异:blogs.msdn.com/b/sqltips/archive/2008/06/26/…
  • 你认为COALESCE的定义和拼音在这里有用吗?就个人而言,我觉得这有点侮辱。
  • @AaronBertrand 是的,我认为合并的定义很有帮助。这不是一个常用的术语。答案是基于对COALESCE 是一个命名良好的函数的理解,因此消除对该术语含义的任何歧义是有帮助的。我怀疑你是否会像我发现你的评论那样发现我包含的定义是侮辱性的。
  • 好吧,不管怎样...侮辱性的部分是,如果有人不知道它的含义或发音,你是在暗示他们没有心理咨询能力自己的字典。你可以不同意所有你喜欢的;我只是告诉你它在我看来如何。如果不明确:in·sult·ing in-suhl-ting:给予或造成侮辱;以冒犯粗鲁、傲慢等为特征。
  • 我已经编辑了你的答案,因为这个词的定义与答案无关。
猜你喜欢
  • 2020-09-04
  • 2022-01-23
  • 2015-05-31
  • 2019-07-24
  • 2021-06-20
  • 2017-01-16
  • 1970-01-01
  • 2020-01-18
  • 2020-02-11
相关资源
最近更新 更多