1. 程式人生 > >SQL中的疊加--結果集合轉換為字串(小提示) 轉

SQL中的疊加--結果集合轉換為字串(小提示) 轉

SQL中的疊加(小提示):有如下的需求,用SQL實現把結果集合轉換為字串.

如下:

 

可以有至少如下三種方法來做轉換:

1. 在.NET中通常的做法是先取出結果集放在DataTable中,再利用foreach迴圈取出每個欄位串聯起來. 亦如這樣,在SQL中也有相同的做法,就是用遊標(CURSOR)做迴圈,示例程式碼如下:

Cursor declare@mytabletable
(
Col1
varchar(10)
)

insertinto@mytablevalues
(
'AA'),
(
'BB'),
(
'CC')selectSUBSTRING(@Colstring,2,LEN(@Colstring)-1)
as Colstringdeclare mytype cursor local forselect Col1 from@mytableopen mytype
fetchnextfrom mytype into@Col1while@@FETCH_STATUS=0beginset@Colstring+=','+@Col1fetchnextfrom mytype into@Col1enddeallocate mytypedeclare@Colstringvarchar(50)=''declare@Col1varchar(10)

轉換之後的字串:

CURSOR在SQL中的效率很差,當資料量比較大時(>1 Million)會嚴重影響效能,不建議使用.

2. SQL查詢中直接賦值,這種方式CODE比較簡捷.

程式碼 declare@mytabletable
(
Col1
varchar(10)
)

insertinto@mytablevalues
(
'AA'),
(
'BB'),
(
'CC')declare@Colstringvarchar(50)

select@Colstring=isnull(@Colstring+',' , '' ) +isnull( Col1 , '' )
from@mytableselect@Colstringas Colstring

執行結果: 

3. FOR XML PATH

 首先轉換為XML的資料庫型別. 

declare
@mytabletable
(
Col1
varchar(10)
)

insertinto@mytablevalues
(
'AA'),
(
'BB'),
(
'CC')

SELECT','+Col1 --No aliasFROM@mytableORDERBY Col1
FOR XML PATH('TYPE')

可以看到輸入結果是XML型別的,TYPE為節點

<TYPE>,AA</TYPE><TYPE>,BB</TYPE><TYPE>,CC</TYPE>

假如沒有TYPE節點,就會接近想要的結果,修改CODE如下:

程式碼 declare@mytabletable
(
Col1
varchar(10)
)

insertinto@mytablevalues
(
'AA'),
(
'BB'),
(
'CC')

SELECT','+Col1 --No aliasFROM@mytableORDERBY Col1
FOR XML PATH('')

 

太好了,只需要把前置逗號(,)取消就OK了,接續修改CODE:

FOR XML PATH declare@mytabletable
(
Col1
varchar(10)
)

insertinto@mytablevalues
(
'AA'),
(
'BB'),
(
'CC')

selectSTUFF((
SELECT','+Col1 --No aliasFROM@mytableORDERBY Col1
FOR XML PATH('')) ,1,1,space(0)) as Colstring

得到需求的結果:

擴充套件如下:

程式碼 declare@mytabletable
(
id
int,
potype
varchar(10)
)

insertinto@mytablevalues (1,'A>A')
insertinto@mytablevalues (1,'B&B')
insertinto@mytablevalues (1,'C<C')

SELECT p1.id,
STUFF ( ( SELECT','+potype
FROM@mytable p2
WHERE p2.id = p1.id
ORDERBY potype
FOR XML PATH(''),TYPE
).value(
'.','VARCHAR(MAX)') , 1,1,SPACE(0)) AS Concat_Values
FROM@mytable p1
GROUPBY p1.id ; 程式碼 DECLARE@mytableTABLE (
id
INTEGERNOTNULL,
potype
VARCHAR(10) NOTNULL
);

INSERT@mytableVALUES (1,'A>A');
INSERT@mytableVALUES (1,'B&B');
INSERT@mytableVALUES (1,'C<C');

SELECT P1.id,
csv
=STUFF
(
(
SELECT','+ P2.potype
FROM@mytable P2
WHERE P2.id = P1.id
ORDERBY P2.potype ASCFOR XML PATH(''), TYPE
).value(
'./text()[1]', 'VARCHAR(MAX)')
,
1, 1, SPACE(0)
)
FROM@mytable P1
GROUPBY P1.id;

推薦採用第二種,或是第三種方法.

相關推薦

SQL疊加--結果集合轉換字串(提示)

SQL中的疊加(小提示):有如下的需求,用SQL實現把結果集合轉換為字串. 如下:   可以有至少如下三種方法來做轉換: 1. 在.NET中通常的做法是先取出結果集放在DataTable中,再利用foreach迴圈取出每個欄位串聯起來. 亦如這樣,在SQL中也有相同的做法

關於SQL Server中將數值型別轉換字串的問題(

今天將Excel中的資料匯入到資料庫表A後,某一列被自動定義成了Float資料型別,然而,我們的正式庫中的表B的相對應的列是Varchar型別的,所以,就出現了表B中所對應的列資料變成了科學計數法的形式。  今天在把一些資料匯入到SQL Server的時候遇到有個列被匯入成f

在win32程式,將浮點數轉換字串

因為是unicode型別,所以沒有用sprintf()函式,而是以為用wsprintf就可以解決問題了, wsprintf(strValue,L"%f",douValue); 結果怎麼也輸不出結果,除錯看了下,strValue中的值是f,並不是一串數字,在網上查了些資料,發

esp8266 inet_ntoa函式實現 ip地址轉換字串 MAC地址字串

esp8266晶片可作為mcu,功能很強大,但與傳統mcu相比,可用資源實在不多,連浮點數都不支援 IP地址轉字元創函式inet_ntoa很方便,但8266中沒有!!!!! 本節將講述如何自己實現inet_ntoa函式 ip轉字串 ******************

Java數值較大的double型別轉換字串時會用科學計數法不使用千分位顯示的解決辦法

java.text.NumberFormat nf = java.text.NumberFormat.getInstance(); // 不使用千分位,即展示為11672283.234,而不是11,672,283.234 nf.setGroupingUsed(false); // 設

字串的大寫字母轉換小寫字母

實現函式 ToLowerCase(),該函式接收一個字串引數 str,並將該字串中的大寫字母轉換成小寫字母,之後返回新的字串。 示例 1: 輸入: "Hello" 輸出: "hello" 示例 2: 輸入: "here" 輸出: "here" 示例 3: 輸入:

使用StringUtils工具類將集合陣列等轉換字串

首先匯入xwork-core.jar的StringUtils類: import org.apache.commons.lang.xwork.StringUtils; 第一:list轉換字串 List<String> list = new ArrayList&l

C++怎樣將整型值轉換字串

最簡單的方法是使用一個字串流(stringstream):#include<iostream>#include<string>#include<sstream>using namespace std;string itos(int i)

如果將Java從資料庫查詢到的結果轉換Json陣列形式

package util; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.Date; import net.sf.json.JSONArray; import n

Java數字轉換字串字串轉換字元

String str = "123"; int num = 12; //字串轉換為數字 int tranToNum = Integer.parseInt(str, 16);//這裡的16表示十六進位制

C語言把數字轉換字串

在將各種型別的資料構造成字串時,sprintf 的強大功能很少會讓你失望。由於sprintf 跟printf 在用法上幾乎一樣,只是列印的目的地不同而已,前者列印到字串中,後者則直接在命令列上輸出。這也導致sprintf 比printf 有用得多。sprintf 是個變參函

java 十六進位制轉換字串,java GSON-JSON解析。

private void ceshi() { String data = "600000343555031374432354230307B22616464496E666F223A7B227265737" + "56C745F636F64652

java位元組陣列轉換字串

1、位元組陣列轉換為字串 byte[] byBuffer = new byte[20]; ... ... String strRead = new String(byBuffer); strRead=String.copyValueOf(strRead.toCharArray(), 0, byBuffer.l

javaString類型轉換yyyy-MM-dd的Date類型

col code edate birt mat led div get sys String birthday ="2017-02-22"; SimpleDateFormat sdf = new SimpleDateFormat(("yyyy-MM-dd")); jav

VS2013 CString類型轉換LPCSTR類型

結構 version truct true ast fin blog logs lpcstr     HWND hWnd = ::FindWindow(NULL, L"XXXXXXX"); if (hWnd != NULL) { DWORD dwReadB

python列表的所有值轉換字符串,以及列表拼接成一個字符串

bsp nbsp python class pan code blog 字符 for >>> ls1 = [‘a‘, 1, ‘b‘, 2] >>> ls2 = [str(i) for i in ls1] >>> ls2

js字符串轉換日期型

一個 日期函數 alt 返回日期 代碼 函數 分享 方案 技術分享 簡介:字符串轉日期型函數 傳入一個字符串格式的日期,如何轉換為日期型的。以下為轉換方案。 //字符串轉換為日期函數,返回日期型(傳入的日期格式2014-04-22) function StringTo

sql查詢出來的列轉換逗號隔開的字符串

tar sta mes 產生 類型 sql查詢 for rep path select top 1000 fid,replace(stuff((select distinct ‘,‘+substring(f_paez_spmc1,1,charindex(‘ ‘,f_paez

C:itoa 數字轉換字串

//數字轉換為字串 char* itoa(int num,char *str,int radix) { //索引表 char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //中間變數 unsigned un

C# 將16進位制的btye陣列轉換字串

        /// <summary>         /// btye陣列轉換為字串         /// </summary> &nb