如何根据以下条件对表进行SQL查询:
示例表人(FirstName,LastName,Street,City,State):
Bob | Dylan | 555 Street | Mountain View | California
Ally | M | NULL | Seattle | Washington
Jan | Van | EMPTY | EMPTY | Oregon
Nancy | Finn | EMPTY | EMPTY | NA
Don | William | NULL | EMPTY | Illinois
结果:
Bob-Dylan-555 Street-Mountain View-California
Ally-M-Seattle-Washington
Jan-Van-Oregon
Nancy-Finn
Don-William-Illinois
我知道这可以以编程方式完成,但想知道这是否可以在SQL中完成,以及在查询本身中这样做是否更有效。
答案 0 :(得分:1)
SQL Server 2017及更高版本的完全解决方案:
SELECT *
FROM Person p
OUTER APPLY (
SELECT STRING_AGG(NULLIF(NULLIF(val, 'EMPTY'), 'NA'), '-')
WITHIN GROUP (ORDER BY n) AS val
FROM (VALUES (1, p.FirstName), (2, p.LastName),(3, p.Street),
(4,p.City), (5, p.State)) z(n, val)
)sub;
<强> DBFiddle Demo 强>
使用CONCAT_WS
的MySQL版本:
CONCAT_WS()代表Concatenate With Separator,是CONCAT()的一种特殊形式。第一个参数是其余参数的分隔符。在要连接的字符串之间添加分隔符。分隔符可以是字符串,其余参数也可以。如果分隔符为NULL,则结果为NULL。
CONCAT_WS()不会跳过空字符串。但是,它会在分隔符参数后跳过任何NULL值。
SELECT CONCAT_WS('-',
NULLIF(NULLIF(FirstName, 'EMPTY'), 'NA'),
NULLIF(NULLIF(LastName, 'EMPTY'), 'NA'),
NULLIF(NULLIF(Street, 'EMPTY'), 'NA'),
NULLIF(NULLIF(City, 'EMPTY'), 'NA'),
NULLIF(NULLIF(State, 'EMPTY'), 'NA')) AS r
FROM Person p;
<强> DBFiddle Demo2 强>
答案 1 :(得分:0)
您的选择应该是这样的:
select isnull(FieldA,'')+ '-' + isnull (FieldB,'') + '-' + isnull (FieldC,'') ....
依旧......
如果您不想要' - ',如果前一个字段为空,那么这将在MS SQL服务器上运行。
如果你想要替换'Empty'或'NULL'字符串,你应该使用:
select replace(replace( isnull(FieldA+'-','') , 'Empty' , ''),'Null', '')
我通过Nitin_g3观察修改了isnull()。
答案 2 :(得分:0)
首先,使用 CONCAT 来连接字段。 然后使用 REPLACE 替换NULL值
SELECT REPLACE( CONCAT( field1, "-", field2 , "-", field3) , "NULL", "EMPTY" )
FROM `table`
答案 3 :(得分:0)
试试这个
SELECT ISNULL(FirstName,'') + '-' +
ISNULL (LastName,'') + '-' +
ISNULL (City,'') + '-' +
ISNULL (State,'')
FROM Person
或者就像这样
SELECT CASE WHEN ISNULL(FirstName,'') = '' THEN '' ELSE FirstName + '-' +
CASE WHEN ISNULL(LastName,'') = '' THEN '' ELSE LastName + '-' +
CASE WHEN ISNULL(City,'') = '' THEN '' ELSE City + '-' +
CASE WHEN ISNULL(State,'') = '' THEN '' ELSE State + '-' END AS
ColumnName
FROM Person