在两个选定字段之间插入可选分号

时间:2016-03-02 11:47:52

标签: sql sql-server tsql

这是我的SQL子句

comment1

如果列中没有值,那么我只得到一个分号。如果该值不在;xyz中,那么我将获得comment1

我想要那个:

  • comment2note1 = ''以及comment1
  • 中没有值时
  • 如果comment2中没有值,但xyz中有值{{1}}

3 个答案:

答案 0 :(得分:4)

您可以使用NULLIF将空字符串转换为NULL。然后将NULL与';'连接起来仍然是NULL,可以使用ISNULL转换为空字符串:

WITH masters (comment1, comment2) AS (
    SELECT NULL, NULL UNION ALL
    SELECT ' 1', NULL UNION ALL
    SELECT NULL, '2 ' UNION ALL
    SELECT '3 ', ' 4' UNION ALL
    SELECT ''  , ''   UNION ALL
    SELECT ' 5', ''   UNION ALL
    SELECT ''  , '6 ' UNION ALL
    SELECT '7 ', ' 8'
)
SELECT
    ISNULL(
        (
            ISNULL(NULLIF(LTRIM(RTRIM(masters.comment1)), '') + ';', '')
            + NULLIF(LTRIM(RTRIM(masters.comment2)), '')
        )
        , ISNULL(LTRIM(RTRIM(masters.comment1)), '')) Note1
FROM masters;

更新Jorge Campos使用CASE提供了一个简单易用的解决方案:

WITH masters (comment1, comment2) AS (
    SELECT NULL, NULL UNION ALL
    SELECT ' 1', NULL UNION ALL
    SELECT NULL, '2 ' UNION ALL
    SELECT '3 ', ' 4' UNION ALL
    SELECT ''  , ''   UNION ALL
    SELECT ' 5', ''   UNION ALL
    SELECT ''  , '6 ' UNION ALL
    SELECT '7 ', ' 8'
)
SELECT        ISNULL(LTRIM(RTRIM(masters.comment1)), '') + 

    CASE WHEN ISNULL(LTRIM(RTRIM(masters.comment1)), '') <> ''
          AND ISNULL(LTRIM(RTRIM(masters.comment2)), '') <> ''
         THEN ';'
         ELSE ''
    END +  
              ISNULL(LTRIM(RTRIM(masters.comment2)),'') AS Note1 
FROM masters;

答案 1 :(得分:2)

当数据为两列时,这将添加分号

SELECT 
  COALESCE(LTRIM(RTRIM(comment1)),'') + 
  CASE WHEN NULLIF(comment1, '') + NULLIF(comment2, '')IS NULL THEN '' ELSE ';' END +
  COALESCE(LTRIM(RTRIM(comment2)),'')
FROM yourtable

答案 2 :(得分:0)

如果其中一个为空,则使用空格,否则为“;”。如果其中任何一个为null,则coalesce将返回NULL,否则返回'null'

LTRIM(RTRIM(Masters.comment1))
+ CASE WHEN (coalesce(@a + @b, 'eithernull')) = 'eithernull' THEN '' ELSE ';' END 
+ LTRIM(RTRIM(masters.comment2))