Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在串联上使用If Not Null的SQL_Sql_Null_Concatenation - Fatal编程技术网

在串联上使用If Not Null的SQL

在串联上使用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姓

如果我有桌子

这将显示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可能使用
  • 尽管Oracle将零长字符串视为空字符串,但将零长字符串与另一个操作数串联始终会产生另一个操作数,因此空字符串只能由两个空字符串串联而成。

    | |
    凝聚运算符:

     -- 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
      表达式将blank
      Middlename
      减少为
      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