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)
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(
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
java中String類型轉換為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