一般存了這樣的值, 是想要轉成如下的資料表去跟其他的資料表做 JOIN 或是透過 WHERE 去濾資料.
FID | MyField |
1 | 001 |
1 | 002 |
1 | 003 |
網路常見的做法是將 MyField 的值轉成 "001,002,003," 讓每個項目都維持 "xxx," 的格式, 再用 LIKE 去查資料.
或是將欄位值取出後, 在程式中去 Split 這個資料, 然後做許多的資料處理.
現在在 SQL 2005 中, 可以透過 WITH 的方式遞迴地將資料形成如上的表格:
例如以下的 SQL 句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | WITH B (FID, CurrentItem, SubItem) AS ( SELECT FID, SUBSTRING (MyField,1,CHARINDEX( ',' , MyField)-1) CurrentItem, SUBSTRING (MyField,CHARINDEX( ',' , MyField)+1,LEN(MyField)) SubItem FROM MyTable --WHERE FID=1 這邊可以針對例如FID=1的資料做查詢 UNION ALL SELECT A.FID, CASE WHEN CHARINDEX( ',' , SubItem)>0 THEN SUBSTRING (SubItem,1,CHARINDEX( ',' , SubItem)-1) ELSE SubItem END CurrentItem, CASE WHEN CHARINDEX( ',' , SubItem)>0 THEN SUBSTRING (SubItem,CHARINDEX( ',' , SubItem)+1,LEN(SubItem)) ELSE '' END SubItem FROM MyTable A INNER JOIN B ON A.FID=B.FID AND SubItem<> '' --多一個SubItem<>''的條件判斷, 不然會無窮遞迴下去 ) SELECT * FROM B ORDER BY FID |
FID | CurrentItem | SubItem |
1 | 001 | 002,003 |
1 | 002 | 003 |
1 | 003 | |
2 | 002 | 004,005 |
2 | 004 | 005 |
2 | 005 |
沒有留言:
張貼留言