我有一个前端字段,用户应该在其中看到几个字段的值,并以逗号连接。如果字段总是填充,这很容易,但事实并非如此。为了避免额外的逗号和空格,我提出了:
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
语句很快就会失控,因为它们引用了之前的所有字段。有没有一种有效的方法来做这样的事情?
答案 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?