2017-07-13 3 views
-1

にNULL値なしの列を連結する方法この問題は、ここで多くの時間を尋ねているが、私は期待していて適切な出力を得ていないのですその中にNULL値が必要です。 OrderTableは、SQL

Customer_Number order1 order2 order3 order4 
    1    NULL  X  Y  NULL 
    2    NULL  A  B  NULL 
    3    V  NULL  H  NULL 

は、今私がしたい場合のみ、このような順序のための連結方法でデータです:

Customer_Number  Order 
    1     X,Y 
    2     A,B 
    3     V,H 
私はSQL Serverの2008 concate機能は2008年

例では動作しませんがしたいです

これは私がすることだ、私は

Select Customer_number, ISNULL(NULLIF(order1,' ')+',','')+ 
ISNULL(NULLIF(order2,' ')+',','')+ 
ISNULL(NULLIF(order3,' ')+',','')+ 
ISNULL(NULLIF(order4,' ')+',','') 
as Order from Ordertable 

を使用するコードです低出力

Customer_Number  Order 
    1    NULL,X,Y,NULL 
    2    NULL,A,B,NULL 
    3    V,NULL,H,NULL 

私はすでに合体、スタッフ、ISNULL、NULLIFを試してみたが、すべてが事前に同じ結果に

感謝を持っています!

答えて

1

Declare @YourTable Table ([Customer_Number] varchar(50),[order1] varchar(50),[order2] varchar(50),[order3] varchar(50),[order4] varchar(50)) 
Insert Into @YourTable Values 
(1,NULL,'X','Y',NULL) 
,(2,NULL,'A','B',NULL) 
,(3,'V',NULL,'H',NULL) 


Select Customer_Number 
     ,[Order] = IsNull(stuff(
        IsNull(','+order1,'') 
       +IsNull(','+order2,'') 
       +IsNull(','+order3,'') 
       +IsNull(','+order4,'') 
       ,1,1,''),'') 
From @YourTable 

戻り

Customer_Number Order 
1    X,Y 
2    A,B 
3    V,H 

EDIT - "NULL" は、文字列とNOT NULL値

あるのIF
Declare @YourTable Table ([Customer_Number] varchar(50),[order1] varchar(50),[order2] varchar(50),[order3] varchar(50),[order4] varchar(50)) 
Insert Into @YourTable Values 
(1,'NULL','X','Y','NULL') 
,(2,'NULL','A','B','NULL') 
,(3,'V','NULL','H','NULL') 


Select Customer_Number 
     ,[Order] = IsNull(stuff(
        IsNull(','+nullif(order1,'NULL'),'') 
       +IsNull(','+nullif(order2,'NULL'),'') 
       +IsNull(','+nullif(order3,'NULL'),'') 
       +IsNull(','+nullif(order4,'NULL'),'') 
       ,1,1,''),'') 
From @YourTable 
+0

質問から:*私はSQL Server 2008のconcate関数が2008年に動作しません。* – DavidG

+0

私はorder4の値を持っている場合は、X、Yのようになります最後に、このクエリで削除するには – Amitesh

+0

私はorder4で値を持っています。これはX、Yのようになります。このクエリで最後に削除する方法、NULL、Null、NUllなどのNULL文字列の場合は – Amitesh

0

これは少し不快である、それは末尾を削除するには、サブクエリにする必要があります(あなたがCTEを使用することができますが)効率的COMMA:

SELECT 
    Customer_number, 
    SUBSTRING([Order], 0, LEN([Order])) AS [Order] 
FROM(
    SELECT 
     Customer_number, 
     COALESCE(order1+',', '') + 
     COALESCE(order2+',', '') + 
     COALESCE(order3+',', '') + 
     COALESCE(order4+',', '') AS [Order] 
    FROM 
     OrderTable) AS SubQuery 
0

あなたは、合体して正しい軌道に乗っていましたまたはIsNull。長さを追跡し、部分文字列、左またはものを使用しようとする代わりに、置換を使用して、合体から現れる末尾のカンマを削除しました。前のSQL Serverに値を連結するFOR XMLトリックを実証

Select Customer_number, 
    Replace(
     Coalesce(Order1 + ',','')+ 
     Coalesce(Order2 + ',','')+ 
     Coalesce(Order3 + ',','')+ 
     Coalesce(Order4 + ',','') 
    +',',',,','') --Hack to remove the Last Comma 
as [Order] from Ordertable 
3

楽しさと利益のためのもう一つの変化は、2012年

SELECT Customer_Number, STUFF(
    (SELECT ',' + order1, ',' + order2, ',' + order3, ',' + order4 FOR XML PATH('')), 
    1, 1, '' 
) 

これは、わずかな列の一定の数のやり過ぎ(特に効率的ではありません)、連結のために覚えやすいパターンです。また、それはSTUFFを示しています。これは、SQL開発者が愛するべきことを学ぶべき機能です。