【问题标题】:Concatenating null to string using + results in null使用 + 将 null 连接到字符串会导致 null
【发布时间】:2015-08-09 12:49:48
【问题描述】:

我在 Access 中有以下 SQL 查询:

SELECT ID, CurrencyName + ' (' + CurrencySymbol + ')' AS [Currency], 
CurrencyLocation, CurrencySymbol FROM Currencies ORDER BY SortOrder

我注意到,我得到了一个完整的结果表,除非字段 CurrencySymbol 保留为 NULL 或为空。如果 CurrencySymbol 字段为空,而不是 Concatenate nothing,Access 将跳过记录并继续,如下所示

.

是我做错了什么还是有更好的方法来编写这个查询?

【问题讨论】:

  • 尝试使用& 而不是+ 作为连接运算符。当涉及到空值时,它们的行为不同。您可能还想看看Format() 函数。

标签: sql ms-access


【解决方案1】:

如果你用+ 连接字符串,string + NULL 会产生NULL

如果将字符串与& 连接,string & NULL 将产生string

因此,您有两种选择来解决此问题:

选项 1:CurrencyName + ' (' + Nz(CurrencySymbol, '') + ')'。 Nz (NullToZero) 将 Null 值转换为其第二个参数。

选项 2:CurrencyName & ' (' & CurrencySymbol & ')'

您可以使用这个事实来创建一个仅在存在货币符号时才显示括号的表达式(此想法的功劳归于this blog post):

CurrencyName & (' (' + CurrencySymbol + ')') 将产生 PointsEuro (€)

【讨论】:

  • 哦,我以为 Concatenate 只适用于 + 我不知道 & 是一个选项
  • & 是一个显式的 string 连接运算符。所以,3 + 4 产生 7,但 3 & 4 产生 "34"
【解决方案2】:

那是因为连接字符串和 NULL 会导致 NULL。

SELECT ID, CurrencyName + ' (' + Iif(IsNull(CurrencySymbol), '', CurrencySymbol) + ')'
  AS [Currency], CurrencyLocation, CurrencySymbol
FROM Currencies
ORDER BY SortOrder

【讨论】:

  • 稍作修改后,我就得到了我希望第一次格式化它的方式。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2011-02-24
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多