2009-10-19 51 views
4

我有一列有1列varchar值的表。如果可能的話,我正在尋找一種方法將這些值連接成一個沒有循環的單個值。如果一個循環是最有效的方法,那麼我會這樣做,但我認爲在默認該方法之前我會要求其他選項。我也想保留在SQL查詢中。在沒有循環的單個列中連接記錄?

最終,我想做一個分裂函數的反義詞。

是否有可能沒有循環(或光標),或者我應該使用循環來實現這種情況?

編輯: 由於在MySql中如何做到這一點非常好(與MS Sql相反,就像我最初打算的那樣),我決定重新編寫代碼,以便其他人也能夠找到答案。

+0

+1感謝。也許一個簡單的概念,但非常有價值。 – madcolor 2009-10-23 13:27:21

回答

6

申報@concat VARCHAR(最大) 組@concat = ''

選擇@concat = @concat + COL1 + ' 從tablename1

+3

使用此方法時,您無法使用訂單。你可以使用FOR XML PATH,就像我的答案一樣。然而,FOR XML PATH適用於SQL Server 2005並且最多可以使用 – 2009-10-20 15:28:52

+0

@KM謝天謝地,在我的情況下,我不需要order by子句;然而,知道這很好。 – JamesEggers 2009-10-20 16:20:29

+0

@KM。如果您確實需要ORDER BY子句,則可以選擇TOP 100%,並且SQL Server將允許它。 – Curt 2015-05-28 17:06:58

1

,' 我剛解決的問題像這樣和循環永遠佔據。因此,我將演示媒體中的值(在這種情況下是Crystal Reports)的數值放在一起,速度非常快。

只是一個想法。

+0

不幸的是,我正在編寫的腳本是純數據操作來糾正一些不良數據。如果是UI相關的話,我會同意這樣做會是更好的選擇。 – JamesEggers 2009-10-19 22:00:23

1

如果是MySQL,你可以使用GROUP_CONCAT

選擇一個,GROUP_CONCAT(B分離器 '')FROM表GROUP BY A;

+0

供參考:有些人會因爲提供一個不相關的答案而讓你失望。 – 2009-10-20 00:43:22

+0

當我在尋找MS Sql的時候,我仍然會贊成它,因爲別人也可能會詢問這個問題。 – JamesEggers 2009-10-20 01:09:23

+0

但是當它被標記爲sql,sql-server和tsql時,他們不會去發現它...... – 2009-10-20 01:36:40

5

試試這個:

DECLARE @YourTable table (Col1 int) 
INSERT INTO @YourTable VALUES (1) 
INSERT INTO @YourTable VALUES (2) 
INSERT INTO @YourTable VALUES (30) 
INSERT INTO @YourTable VALUES (400) 
INSERT INTO @YourTable VALUES (12) 
INSERT INTO @YourTable VALUES (46454) 

SELECT 
    STUFF(
      (
        SELECT 
         ', ' + cast(Col1 as varchar(30)) 
         FROM @YourTable 
         WHERE Col1<=400 
         ORDER BY Col1 
         FOR XML PATH('') 
      ), 1, 2, '' 
     ) 

OUTPUT:

------------------- 
1, 2, 12, 30, 400 

(1 row(s) affected)