如何创建连接和解析结果集

时间:2017-11-26 11:10:59

标签: mysql sql memsql

如何根据以下条件对表进行SQL查询:

  • 结果是一个列,用于将由短划线分隔的所有字段连接成一个字符串(例如: FieldA-FieldB-FieldC-FieldD-FieldE
  • 如果给定字段为NULL或字段值为字符串,例如" EMPTY "或" NA ",不要将该字段的值连接到结果字符串

示例表人(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中完成,以及在查询本身中这样做是否更有效。

4 个答案:

答案 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