在串联上使用If Not Null的SQL
如果我有桌子 这将显示Firstname Middlename姓氏,例如在串联上使用If Not Null的SQL,sql,null,concatenation,Sql,Null,Concatenation,如果我有桌子 这将显示Firstname Middlename姓氏,例如 John--Smith Jane-Anne-Smith 第二个(Jane的)显示正确,但是由于John没有中间名,我希望它忽略第二个破折号 我怎样才能把一种IF Middlename=NULL语句放进去,使它只显示John Smith您可以使用REPLACE(如果是Oracle) 警告:我假设没有以-作为第一个或最后一个字符的有效名称 用于下选投票者 OP明确表示: 这将显示Firstname Middlename姓
John--Smith
Jane-Anne-Smith
第二个(Jane的)显示正确,但是由于John没有中间名,我希望它忽略第二个破折号
我怎样才能把一种IF Middlename=NULL语句放进去,使它只显示John Smith您可以使用
REPLACE
(如果是Oracle)
警告:我假设没有以-
作为第一个或最后一个字符的有效名称
用于下选投票者 OP明确表示: 这将显示Firstname Middlename姓氏,例如
John--Smith
Jane-Anne-Smith
约翰-史密斯
因此:
Middlename
为空:'
此解决方案适用于SQLite/PostgreSQL/Oracle
Middlename
为NULL
且OP可能使用| |
凝聚运算符:
-- PostgreSQL/SQLite
SELECT 'sth' || NULL
-- NULL
-- Oracle
SELECT 'sth' || NULL
-- sth
一种解决方案可以是使用
案例陈述
select case Middlename is not null then (Firstname || '-' || Middlename || '-' || Surname)
else (Firstname || '-' || Surname) end AS example_column
from ....
您可以使用
CASE
语句
select Firstname
|| case when Middlename <> '' Then '-'||Middlename else '' END
|| case when Surname<> '' Then '-'||Surname else '' END
选择Firstname
||当Middlename“”然后“-| | Middlename else”结束时的大小写
||当姓氏“Then”-“姓氏else”结束时的大小写
根据您的样本数据,我已检查了空字符串
。要检查NULL
请使用Middlename不为NULL
而不是Middlename'
此方法:
输出:
| ?column? |
|-----------------|
| john-smith |
| jane-anne-smith |
| ?column? |
|-----------------|
| john-smith |
| obi-kinobi |
| jane-anne-smith |
更新
实时代码:
正如我所知,有人会给出一个不存在问题的场景。因此,要使它在中间名为空的情况下工作。只需为空字符串添加nullif:
select first_name || coalesce('-' || nullif(middle_name,'') , '') || '-' || last_name
from t;
输出:
| ?column? |
|-----------------|
| john-smith |
| jane-anne-smith |
| ?column? |
|-----------------|
| john-smith |
| obi-kinobi |
| jane-anne-smith |
这可能是一个可行的选择:
SELECT FirstName || '-' || ISNULL(MiddleName + '-', '') || Surname
由于NULL与字符串连接会产生NULL,因此我们可以尝试构建子字符串并用空字符串替换NULL,然后将空字符串连接到名称的下一部分
这假设FirstName和姓氏始终不为NULL,但您也可以对其应用相同的逻辑 以下是我的建议: PostgreSQL和其他SQL数据库,其中
'a'| | NULL为NULL
,然后使用:
Oracle和其他SQL数据库,其中'a'| NULL='a'
:
SELECT first name || DECODE(middlename, NULL, '', '-' || middlename) || '-' || surname...
我喜欢简洁。在这里,无论中间名是否为空,任何维护程序员都不太感兴趣。外壳开关很好,但体积很大。我希望尽可能避免重复相同的列名(“中间名”)
正如@Prdp所指出的,答案是RDBMS特有的。具体的是服务器是否将零长度字符串视为等同于NULL
,这决定了串联NULL
是否产生NULL
通常,
COALESCE
对于PostgreSQL样式的空字符串处理最简洁,而DECODE(*VALUE*,NULL,“…
对于Oracle样式的空字符串处理最简洁。如果您使用Postgres,concat_ws()
就是您想要的:
SELECT concat_ws('-', Firstname, Middlename, Surname) AS example_column
FROM example_table
SQLFiddle:
要处理空字符串或仅包含空格的字符串,如NULL
,请使用NULL()
NULLIF
表达式将blankMiddlename
减少为NULL
- 将
'-'
与NULL
连接将始终返回NULL
VALUE
表达式用空字符串替换NULL
s
_
您需要标记正在使用的RDBMS。通常,每个供应商的字符串连接不同。基于流行的四数据库,它是Oracle或PostgreSQLNote。这假设Oracle空字符串=“”操作。对于downvoter,请留下注释,说明此解决方案无效的原因。重试:,使用cte作为(选择‘卢克’作为名字,选择‘绝地’作为中间名,选择‘大师’作为名字,选择‘达斯’作为名字,选择‘我是你父亲’作为中间名,选择‘维德’作为名字,选择‘维德’作为中间名,选择‘维德某天之后’作为中间名,选择‘扬科维克’作为名字,选择‘欧比’作为名字,选择‘维德’作为中间名,’瓦“nkanobi”作为dual Union的姓氏全部选择“Michael”作为姓氏,“NoSoupForYou”作为中间名,“Buen”作为dual的姓氏)选择FirstName | | | coalesce(“-”| | MiddleName)”)| |'-| | | lastname from cte;
PostgreSQL样式的空字符串处理如果RDBMS没有ISNULL构造,它可能有一个联合,其工作原理类似。当Middlename包含空字符串时不起作用。唉,您是正确的,但在原始问题中没有提到空字符串(参见@Michael Buen对相同情况的回答)。根据问题,答案不完整。空中间名不应该有双精度dash@MichaelBuen:不会的。concat_ws()
会解决这个问题。+1整洁:)我刚刚用空字符串(非空)测试了你的代码,这不是问题所在,这就是为什么我认为这不起作用的原因。@MichaelBuen:您可以使用nullif(middlename,”)
为了将空字符串视为nullYes,我在我的答案上应用了NULLIF。我忘了在您的concat_ws答案上应用相同的值,并在sqlfiddle上进行了测试,因此我认为concat_ws不起作用。与大约21分钟前我的答案相同,只是您使用了VALUE,而不是使用了哪个DBMS支持该值()
function?我假设是DB2。但是解决方案可以调整COALESCE()
,ISNULL()
是其他引擎的替代函数。COALESCE('-'| | NULLIF(middlename'),'')
对我有效,因为在我的情况下,middlename由空字符串组成,即使它在输出中显示为NULL
SELECT first name || DECODE(middlename, NULL, '', '-' || middlename) || '-' || surname...
SELECT concat_ws('-', Firstname, Middlename, Surname) AS example_column
FROM example_table
SELECT concat_ws('-', Firstname, nullif(trim(Middlename), ''), Surname) AS example_column
FROM example_table
SELECT Firstname || VALUE( '-' || NULLIF('Middlename',''),'') || '-' || Surname'
AS example_column
FROM example_table