我有一个包含三个字段的表,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中的默认行为吗?
答案 0 :(得分:118)
尝试
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)。
答案 1 :(得分:67)
查看CONCAT_WS
例如:
CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
产量
TEST STRINGTEST STRING 2
这比围绕一切构建IFNULL
更容易。您可以使用空字符串作为分隔符。
答案 2 :(得分:12)
在mysql中,isnull不会工作一段时间。试试IFNULL(),
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
答案 3 :(得分:6)
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,''))
答案 4 :(得分:5)
您始终可以使用CONCAT_NULL_YIELDS_NULL
设置..
只需运行SET CONCAT_NULL_YIELDS_NULL OFF
,然后所有null
个连接都会产生文本而不是null ..
答案 5 :(得分:3)
Stefan的回答是正确的。 要进一步探测,您需要知道NULL与Nothing不同。 Null表示没有值,换句话说,没有定义。没有什么代表一个空字符串,它实际上是一个值。
Undefined + anything = undefined
坚持良好的数据库潮流!
答案 6 :(得分:3)
如果你得到(就像我在MySQL中那样):
#1582 - Incorrect parameter count in the call to native function 'ISNULL'
您可以用COALESCE替换ISNULL函数:
CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
答案 7 :(得分:2)
SQL Server没有CONCAT
功能
(更新:从MS SQL Server 2012 it was introduced CONCAT function开始)
在默认的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
答案 8 :(得分:2)
从MS SQL Server 2012开始,它引入了CONCAT功能 和according to MSDN
空值隐式转换为空字符串。如果全部 如果为null,则返回varchar(1)类型的空字符串。
所以它足以使用没有IsNull的CONCAT
CONCAT(FirstName, LastName, Email)
答案 9 :(得分:1)
在MS Access的情况下
选项1)选择(FirstName +“”+ LastName +“”+电子邮件)作为成员的Vitals 如果任何字段为null,您将得到空白结果。
选项2)SELECT(FirstName&amp;“”&amp; LastName&amp;“&amp; Email”)作为成员的Vitals 您将使用null获取Space代替字段。
答案 10 :(得分:0)
在观察了这个问题的答案后,您可以将它们全部合并为一个简单的解决方案
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
,这个字段只包含空格或者也是空的,例如:&#39;&#39 ;,&#39; &#39;)输出将是NULL
或NOT NULL
IF 如果该字段不是NULL
或EMPTY