如何有效地连接可能为null的字段?

时间:2017-06-30 21:19:05

标签: sql sql-server tsql sql-server-2012

我有一个前端字段,用户应该在其中看到几个字段的值,并以逗号连接。如果字段总是填充,这很容易,但事实并非如此。为了避免额外的逗号和空格,我提出了:

concat( 
    [field_one], 
    case when [field_one] is not null and [field_two] is not null then ', ' end, 
    [field_two], 
    case when ([field_two] is not null or [field_one] is not null) and [field_three] is not null then ', ' end, 
    [field_three]
) as [list_field]

哪个适用于三个领域。但规格已经改变,将增加更多的领域。 case语句很快就会失控,因为它们引用了之前的所有字段。有没有一种有效的方法来做这样的事情?

4 个答案:

答案 0 :(得分:2)

这是一种方法:

select stuff( coalesce(', ' + field_one, '') +
              coalesce(', ' + field_two, '') +
              coalesce(', ' + field_three, ''), 1, 2, '')

这三个表达式在每个非空字段之前添加', 'stuff()删除了第一个。

答案 1 :(得分:2)

NullIf()用于捕获空/非空值。如果您只有空值和值,则为可选。

示例

Declare @YourTable table (field_one varchar(50),field_two varchar(50),field_three varchar(50))
Insert Into @YourTable values
 ('a','b','c')
,('a',null,'c')
,('a',null,null)
,('a','b',null)
,(null,'b',null)

Select *
      ,list_field = stuff( concat( 
                                   ', '+nullif([field_one],'')
                                  ,', '+nullif([field_two],'')
                                  ,', '+nullif([field_three],'')
                                  )
                         ,1,2,'')
 From @YourTable

<强>返回

field_one   field_two   field_three list_field
a           b           c           a, b, c
a           NULL        c           a, c
a           NULL        NULL        a
a           b           NULL        a, b
NULL        b           NULL        b

答案 2 :(得分:1)

您实际上可以利用NULL + anything = NULL和CONCAT函数的NULL处理能力这一事实。如果没有所有的COALESCE / ISNULL gunk ......它会使语法更清晰......

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData;

CREATE TABLE #TestData (
    Col_1 VARCHAR(20) NULL,
    Col_2 VARCHAR(20) NULL,
    Col_3 VARCHAR(20) NULL 
    );

INSERT #TestData (Col_1, Col_2, Col_3) VALUES
    ('Bob', 'A.', 'Jones'),
    ('123 Some St.', NULL, 'Jacksonville'),
    (NULL, 'R.', 'Smith'),
    ('Roy', 'Finch', NULL),
    (NULL, NULL, 'Prince'),
    (NULL, NULL, NULL),
    ('Arnold', NULL, NULL);

SELECT 
    ConcatString = CONCAT(td.Col_1 + ' ', td.Col_2 + ' ', td.Col_3)
FROM 
    #TestData td;

...输出

ConcatString
--------------------------------------------------------------
Bob A. Jones
123 Some St. Jacksonville
R. Smith
Roy Finch 
Prince

Arnold

答案 3 :(得分:0)

我还没有测试过,但我相信这适用于任何符合ANSI标准的数据库。这可能假定字段是CHAR类型,或者您将使用SQL Server中的CONVERT()或Oracle中的TO_CHAR()来转换它们。

SELECT
    CONCAT(
        COALESCE(field_one, '')
        ,',',COALESCE(field_two, '')
        ,',',COALESCE(field_three, '')
    )
FROM ...

这是关于STUFF()的问题。 Oracle equivalent to SQL Server STUFF function?