CONCAT'ing NULL字段
-
10-07-2019 - |
题
我有一个包含三个字段的表,FirstName,LastName和Email。
这是一些虚拟数据:
FirstName | LastName | Email
Adam West adam@west.com
Joe Schmoe NULL
现在,如果我这样做:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
Joe的Vitals为null,因为只有一个空字段。你是如何克服这种行为的?此外,这是MS SQL Server中的默认行为吗?
解决方案
尝试
ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL
所以,
CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL
如果没有null问题,将返回相同的内容(并且空字符串应为null)。
其他提示
看看CONCAT_WS
例如:
CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
产量
TEST STRINGTEST STRING 2
这比围绕一切构建IFNULL
更容易。您可以使用空字符串作为分隔符。
在mysql中,isnull不会工作一段时间。试试IFNULL(),
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS
建议使用,但是如果你真的迷上了CONCAT,请将它包装在{fn}中,你可以使用ODBC函数,如:
SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS
如果您首先需要<!> lt; space <!> gt;最后但只是当first第一个为null时才能执行此操作:
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
我在firstname上添加了可能为null的空格 - 这意味着只有FirstName有值时空间才会存在。
将它们放在一起,每个之间留有空格:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
您始终可以使用CONCAT_NULL_YIELDS_NULL
设置..
运行SET CONCAT_NULL_YIELDS_NULL OFF
然后所有null
连接将导致文本而不是null ..
Stefan的回答是正确的。 要进一步探测,您需要知道NULL与Nothing不同。 Null表示没有值,换句话说,没有定义。没有什么代表一个空字符串,它实际上是一个值。
Undefined + anything = undefined
坚持良好的数据库潮流!
如果你得到(就像我在MySQL中那样):
#1582 - Incorrect parameter count in the call to native function 'ISNULL'
您可以用COALESCE替换ISNULL函数:
CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
从MS SQL Server 2012开始,它引入了CONCAT功能 和根据MSDN
空值隐式转换为空字符串。如果全部 如果为null,则返回varchar(1)类型的空字符串。
所以在没有IsNull的情况下使用CONCAT就足够了
CONCAT(FirstName, LastName, Email)
SQL Server没有CONCAT
功能。
(更新:从MS SQL Server 2012开始它引入了CONCAT功能 )
在默认的SQL Server行为中,NULL通过表达式传播。
在SQL Server中,人们会写:
SELECT FirstName + LastName + Email as Vitals FROM MEMBERS
如果您需要处理NULL
s:
SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
在MS Access的情况下
选项1)SELECT(FirstName + <!> quot; <!> quot; + LastName + <!> quot; <!> quot; + Email)as Vitals FROM MEMBERS 如果任何字段为null,您将得到空白结果。
选项2)SELECT(FirstName <!> amp; <!> quot; <!> quot; <!> amp; LastName <!> amp; <!> quot; <!> quot; <!> amp;电子邮件)作为会员的Vitals 您将使用null获取Space代替字段。
在观察了这个问题的答案后,您可以将它们全部合并为一个简单的解决方案
CONCAT_WS(',',
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName),
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname),
IF(NULLIF(Email, '') IS NULL, NULL, Email))
所以,简而言之,我们使用CONCAT_WS
连接我们的字段并用,
分隔它们;并注意NULL
字段和EMPTY
不会连接
NULLIF 将检查字段是NOT NULL
还是<=>,一个只包含空格的字段,或者也是空的字段,例如:'','')输出将是<=>或<=>
IF 如果字段不是<=>或<=>
,则会输出字段