2015-05-27 56 views
0

我有一個這樣的表,我想返回列值在('01','02','03','04','' 99' )。此外,值將由';'分隔。所以第1行將是01; 04,第3行將是01; 02; 03; 04,第5行將只是01。應該被刪除。什麼腳本會成功地做到這一點?腳本來連接列和刪除前導/尾隨分隔符

R_NOT_CUR R_NOT_CUR_2 R_NOT_CUR_3 R_NOT_CUR_4 
01   NULL  04   NULL 
98   56   45   22 
01   02   03   04 
NULL  NULL  NULL  NULL 
01   NULL  NULL  NULL 

回答

1

可以使用COALESCE/ISNULLSTUFF做到這一點。像這樣的東西。

SELECT STUFF(
    COALESCE(';'+R_NOT_CUR,'') 
    + COALESCE(';'+R_NOT_CUR_2,'') 
    + COALESCE(';'+R_NOT_CUR_3,'') 
    + COALESCE(';'+R_NOT_CUR_4,''),1,1,'') 
FROM YourTable 

東西將刪除的;

+0

好,謝謝,我給它一個旋轉 –

+0

我在地方R_NOT_CUR,R_NOT_CUR_2,R_NOT_CUR_3,R_NOT_CUR_4的CASE語句更新腳本略有過濾不是<>('01','02','03','04','99')的值,然後按要求工作。謝謝。 –

1

它不建議存放在字符串整數值中第一次出現,但這裏應該工作。試試吧,讓我知道:

DECLARE @yourTable TABLE (R_NOT_CUR VARCHAR(10),R_NOT_CUR_2 VARCHAR(10),R_NOT_CUR_3 VARCHAR(10),R_NOT_CUR_4 VARCHAR(10)); 

INSERT INTO @yourTable 
VALUES ('01',NULL,'04',NULL), 
     ('98','56','45','22'), 
     ('01','02','03','04'), 
     (NULL,NULL,NULL,NULL), 
     ('01',NULL,NULL,NULL); 

WITH CTE_row_id 
AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) row_id, --identifies each row 
      R_NOT_CUR, 
      R_NOT_CUR_2, 
      R_NOT_CUR_3, 
      R_NOT_CUR_4 
    FROM @yourTable 
), 
CTE_unpivot --puts all values in one column so your can apply your where logic 
AS 
(
    SELECT * 
    FROM CTE_row_id 
    UNPIVOT 
    (
     val FOR col IN (R_NOT_CUR,R_NOT_CUR_2,R_NOT_CUR_3,R_NOT_CUR_4) 
    ) unpvt 
    WHERE val IN ('01','02','03','04','99') 
) 

SELECT STUFF(
      COALESCE(';'+R_NOT_CUR,'') + 
      COALESCE(';'+R_NOT_CUR_2,'') + 
      COALESCE(';'+R_NOT_CUR_3,'') + 
      COALESCE(';'+R_NOT_CUR_4,'') 
     ,1,1,'') 
     AS concat_columns 
FROM CTE_unpivot 
PIVOT 
(
    MAX(val) FOR col IN(R_NOT_CUR,R_NOT_CUR_2,R_NOT_CUR_3,R_NOT_CUR_4) 
) pvt 

結果:

concat_columns 
-------------------------------------------- 
01;04 
01;02;03;04 
01 
+0

好的,謝謝我會試試 –

+0

你的腳本可以工作,但也許我應該加入我的問題,我的示例表只是一個更大的示例表的一小部分,所以雖然普通表表達式可以工作,但它不是理想的,因爲根據我的經驗,CTE會對數據庫造成過多的資源衝擊。但非常感謝您的努力! –

0

如果使用SUBSTRING已經有一個參數,它允許你刪除字符

SUBSTRING((SELECT CONCAT('/',p.YourValue) 
      FROM YourTable p 
      Where p.value2 = YourCondition 
      AND pc1.ProfilID = p.ProfilID 
      FOR XML PATH ('')), 
      2, 1000) [ColonneTitle], 

當值'2'是顯示器開始的位置,所以你可以選擇顯示器開始的字符位置。

(對不起我的英文不好,希望它能幫助別人:))

相關問題