CONCAT'ing NULL字段
我有一个表有三个字段,名字,姓氏和电子邮件。
以下是一些虚拟数据:
FirstName | LastName | Email Adam West adam@west.com Joe Schmoe NULL
现在,如果我这样做:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
乔的重要性是空的,因为有一个空字段。 你如何克服这种行为? 另外,这是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问题(和一个空string应该是null)。
看看CONCAT_WS
例如:
CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
产量
TEST STRINGTEST STRING 2
这比在任何地方构buildIFNULL
容易。 您可以使用空string作为分隔符。
在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
如果你需要第一个<空格>最后一个,但只是最后一个空时,你可以这样做:
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
我在第一个名字上加了一个空格 – 这可能意味着这个空格只会在FirstName有一个值时才能存在。
把它们放在一起,每个之间有一个空格:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
您始终可以使用CONCAT_NULL_YIELDS_NULL
设置
只需运行SET CONCAT_NULL_YIELDS_NULL OFF
,然后所有的null
连接将导致文本,而不是空的..
斯蒂芬的回答是正确的。 为了深入探究,你需要知道NULL和Nothing不一样。 空值表示没有值,或换句话说,没有定义。 没有什么东西代表一个空string,它实际上是一个值。
未定义的东西=未定义
良好的数据库珍闻坚持!
如果你得到(就像我在MySQL中那样):
#1582 - Incorrect parameter count in the call to native function 'ISNULL'
您可以用COALESCEreplaceISNULL函数:
CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
SQL Server没有CONCAT
function。
(更新:从MS SQL Server 2012开始, 它引入了CONCATfunction )
在默认的SQL Server行为中,NULL通过expression式传播。
在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(名字+“”+姓氏+“”+电子邮件)作为Vitals从成员您将得到空白结果在任何字段与空的情况下。
选项2)SELECT(名字&“”&姓氏&“”&电子邮件)作为Vitals从成员您将获得空间代替字段与空。
从MS SQL Server 2012开始,它引入了CONCATfunction,并根据MSDN
空值被隐式转换为空string。 如果所有参数都为空,则返回一个types为varchar(1)的空string。
所以在没有IsNull的情况下使用CONCAT就足够了
CONCAT(FirstName, LastName, Email)
在观察这个问题的答案之后,你可以把它们全部合并成一个简单的解决scheme
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将检查该字段是NULL
还是EMPTY
,一个只包含空格的字段,或者也是空的,例如:'',''),输出将是NULL
或NOT NULL
IF如果不是NULL
或EMPTY
那么将输出字段