2016-08-03 4 views
0

私は次の表を持っています。 Null値です。シーケンスを取得し、NULLを無視する

X14 X13 X12 X11 X10 X9 X8 X7 X6 
9 ? ? ? ? 1 17 14 ? 
8 9 ? ? ? 1 17 14 ? 
1 8 9 ? ? 1 17 14 ? 
? 1 8 1 9 1 17 14 ? 
? ? 1 ? 9 1 17 14 ? 
? ? ? ? ? 8 9 2 14 

Iはヌルなしで、列を横切っ[...、X(N-1)、X(N)]の値の配列を取得しようとしました。

意図した結果は以下のようになります:

y x1 x2 x3 
9 1 17 14 
8 9 1 17 
1 8 9 1 
1 8 1 9 
1 9 1 17 
8 9 2 14 

私はCOALESCE(X14、COALESCE(X13を、...))を実行しようとしたが、それは上で立ち往生としてそれがうまく動作しません。見つからない最初の値。

Nullをスキップして正しいシーケンスを得るためにできることはありますか?
データベースはハナですが、それにかかわらず答えを共有しています。 :)

ベスト、4つの別々の列にそれらを置く
ミゲル

答えて

2
create column TABLE xvals (X14 INT,X13 INT,X12 INT,X11 INT,X10 INT,X9 INT,X8 INT,X7 INT,X6 INT); 

INSERT INTO xvals (
select 9,NULL,NULL,NULL,NULL,1,17,14,NULL from dummy UNION ALL 
select 8,9,NULL,NULL,NULL,1,17,14,NULL from dummy UNION ALL 
select 1,8,9,NULL,NULL,1,17,14,NULL from dummy UNION ALL 
select NULL,1,8,1,9,1,17,14,NULL from dummy UNION ALL 
select NULL,NULL,1,NULL,9,1,17,14,NULL from dummy UNION ALL 
select NULL,NULL,NULL,NULL,NULL,8,9,2,14 from dummy 
); 

with aschar as (
    select ifnull(to_varchar(X14)||'x', '') || 
      ifnull(to_varchar(X13)||'x', '') || 
      ifnull(to_varchar(X12)||'x', '') || 
      ifnull(to_varchar(X11)||'x', '') ||   
      ifnull(to_varchar(X10)||'x', '') ||   
      ifnull(to_varchar(X9)||'x', '') || 
      ifnull(to_varchar(X8)||'x', '') || 
      ifnull(to_varchar(X7)||'x', '') || 
      ifnull(to_varchar(X6)||'x', '')   
      cval 
    from xvals) 

select SUBSTR_REGEXPR ('[[:digit:]]+' in cval occurrence 1) 
      as y, 
     SUBSTR_REGEXPR ('[[:digit:]]+' in cval occurrence 2) 
      as x1, 
     SUBSTR_REGEXPR ('[[:digit:]]+' in cval occurrence 3) 
      as x2, 
     SUBSTR_REGEXPR ('[[:digit:]]+' in cval occurrence 4) 
      as x3 

from aschar 

Y X1 X2 X3 
9 1 17 14 
8 9 1 17 
1 8 9 1 
1 8 1 9 
1 9 1 17 
8 9 2 14 
+0

非常に賢いです!私の側から+1 – Shnugo

0

は困難です。 SQL Serverとの特定におそらく

select (case when x14 is not null then x14 || ';' else '' end) || 
     (case when x13 is not null then x13 || ';' else '' end) || 
     . . . 
2

が、トリックはXMLであった:あなたは1つのリストに有効な値を連結することができ

XMLを - デフォルトでは - ちょうどNULLs ommits。

他のデータベース(あなたのケースではな)がこれをサポートしませんが、あなたのアイデアを得るかもしれない...

これはあなたが必要とする結果をもたらすだろう。

DECLARE @tbl TABLE(X14 INT,X13 INT,X12 INT,X11 INT,X10 INT,X9 INT,X8 INT,X7 INT,X6 INT); 
INSERT INTO @tbl VALUES 
(9,NULL,NULL,NULL,NULL,1,17,14,NULL) 
,(8,9,NULL,NULL,NULL,1,17,14,NULL) 
,(1,8,9,NULL,NULL,1,17,14,NULL) 
,(NULL,1,8,1,9,1,17,14,NULL) 
,(NULL,NULL,1,NULL,9,1,17,14,NULL) 
,(NULL,NULL,NULL,NULL,NULL,8,9,2,14); 

WITH Casted AS 
(SELECT 
    (
     SELECT * 
     FROM @tbl 
     FOR XML PATH('row'),TYPE 
    ) AS AsXml 
) 
SELECT r.value('*[1]','int') AS y 
     ,r.value('*[2]','int') AS x1 
     ,r.value('*[3]','int') AS x2 
     ,r.value('*[4]','int') AS x3 
FROM Casted 
CROSS APPLY AsXml.nodes('/row') AS A(r) 
+0

PLUS1単にエレガント –

関連する問題