我有一个包含三个字段的表,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 如果字段不是<=>或<=>

,则会输出字段
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top