Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择查询将空值推送到地址行中的最后一列_Sql_Sql Server - Fatal编程技术网

Sql 选择查询将空值推送到地址行中的最后一列

Sql 选择查询将空值推送到地址行中的最后一列,sql,sql-server,Sql,Sql Server,我需要编写一个查询来选择地址行,以便将空值推送到最后一列。例如,如果表中有以下数据 ID, line1, line2, line3, line4, line5, line6 1 null test2 test3 test4 test5 test6 2 test1 test2 test3 test4 test5 test6 3 null null null null test5 test6 4 test1 test2 test3 nul

我需要编写一个查询来选择地址行,以便将空值推送到最后一列。例如,如果表中有以下数据

ID, line1, line2, line3, line4, line5, line6
1   null   test2  test3  test4  test5  test6
2   test1  test2  test3  test4  test5  test6
3   null   null   null   null   test5  test6
4   test1  test2  test3  null   test5  test6
查询的输出应如下所示

ID, line1, line2, line3, line4, line5, line6
1   test2  test3  test4  test5  test6  null
2   test1  test2  test3  test4  test5  test6
3   test5  test6  null   null   null   null
4   test1  test2  test3  test5  test6  null
我试图通过消除空值将值与分隔符连接起来,然后再次拆分这些值,但由于实际数据包含不支持xml的字符,因此很难将这些值拆分回去。有没有一种简单的方法可以在不创建要拆分的函数的情况下实现这一点?当值中没有导致强制转换为xml失败的字符时,下面的代码将起作用

SELECT
  ISNULL(Line1 + '|', '')
+ ISNULL(Line2 + '|', '')
+ ISNULL(Line3 + '|', '')
 + ISNULL(Line4 + '|', '')
  + ISNULL(Line5 + '|', '')
   + ISNULL(Line6 , '')  as tmpaddr 
FROM #addr1

SELECT DISTINCT id,
S.a.value('(/H/r)[1]', 'VARCHAR(100)') AS line1,
S.a.value('(/H/r)[2]', 'VARCHAR(100)') AS line2,
S.a.value('(/H/r)[3]', 'VARCHAR(100)') AS line3,
S.a.value('(/H/r)[4]', 'VARCHAR(100)') AS line4,
S.a.value('(/H/r)[5]', 'VARCHAR(100)') AS line5,
S.a.value('(/H/r)[6]', 'VARCHAR(100)') AS line6
FROM
(
SELECT *,CAST (N'<H><r>' + REPLACE(tmpaddr , '|', '</r><r>')  + '</r></H>'      AS XML) AS [vals]
FROM #addr ) d 
CROSS APPLY d.[vals].nodes('/H/r') S(a)

根据语法约定,假设您使用的是SQL Server

通过交叉应用和聚合,您可以随心所欲:

SELECT a.id, t.*
FROM #addr1 a CROSS APPLY
     (SELECT MAX(CASE WHEN seqnum = 1 THEN line END) as line1,
             MAX(CASE WHEN seqnum = 2 THEN line END) as line2,
             MAX(CASE WHEN seqnum = 3 THEN line END) as line3,
             MAX(CASE WHEN seqnum = 4 THEN line END) as line4,
             MAX(CASE WHEN seqnum = 5 THEN line END) as line5,
             MAX(CASE WHEN seqnum = 6 THEN line END) as line6
      FROM (SELECT num, line, ROW_NUMBER() OVER (ORDER BY num) as seqnum
            FROM (VALUES (1, a.line1),
                         (2, a.line2),
                         (3, a.line3),
                         (4, a.line4),
                         (5, a.line5),
                         (6, a.line6)
                 ) v(num, line)
            WHERE line IS NOT NULL
           ) t
     ) t;

根据语法约定,假设您使用的是SQL Server

通过交叉应用和聚合,您可以随心所欲:

SELECT a.id, t.*
FROM #addr1 a CROSS APPLY
     (SELECT MAX(CASE WHEN seqnum = 1 THEN line END) as line1,
             MAX(CASE WHEN seqnum = 2 THEN line END) as line2,
             MAX(CASE WHEN seqnum = 3 THEN line END) as line3,
             MAX(CASE WHEN seqnum = 4 THEN line END) as line4,
             MAX(CASE WHEN seqnum = 5 THEN line END) as line5,
             MAX(CASE WHEN seqnum = 6 THEN line END) as line6
      FROM (SELECT num, line, ROW_NUMBER() OVER (ORDER BY num) as seqnum
            FROM (VALUES (1, a.line1),
                         (2, a.line2),
                         (3, a.line3),
                         (4, a.line4),
                         (5, a.line5),
                         (6, a.line6)
                 ) v(num, line)
            WHERE line IS NOT NULL
           ) t
     ) t;

请用您正在使用的数据库标记您的问题。为什么需要这样做?请用您正在使用的数据库标记您的问题。为什么需要这样做?