使用 SQL的 for xml path來進行字符串拼接


本篇主要講怎么利用SQL的FOR XML PATH 參數來進行字符串拼接,FOR XML PATH的用法很簡單,它會以xml文件的形式來返回數據。

  我的講解步驟:

        1:構造初始數據

        2:提出問題

        3:簡單介紹FOR XML PATH

        4:解答問題

 

 

   1.構造初始數據

    舉出一個經典的學生課程例子,共有學生、課程與學生課程三張表。

  表1:Student

     

student_id student_name
1 張三
2 李四
3 王五

 

     

      表2:Course

      

course_id course_name
1 語言
2 數學
3 英語

 

 

      表3:Student_Course

   

student_id course_id
1 2
1 3
2 1
2 3
3 3

 

 

   腳本:

復制代碼
create table  student (     student_id int primary key,     student_name nvarchar(50not null )
create table  course (     course_id int primary key,     course_name nvarchar(50not null )
create table  student_course (     student_id int not null,     course_id int not null,     primary key(student_id,course_id) )
復制代碼

 

 

     2.提出問題

       寫一條SQL語句,查詢顯示出下列結果:

       

student_name course_name
張三 數學,英語
李四 語言,英語
王五 英語

 

 

  

    3.簡單介紹 FOR XML PATH

     

      FOR XML PATH 語句能夠把查詢的數據生成XML數據,舉個例子,針對student表,以前SQL語句的查詢結果為:

       

 

select str(student_id) + ',' + student_name from student for xml path('student')

     查詢結果:

<student>         1,張三</student> <student>         2,李四</student> <student>         3,王五</student>

 

       student已成為一個xml文件中的結點了,再看看FOR XML PATH('')的效果,針對上述SQL作出修改,

 

select str(student_id) + ',' + student_name from student for xml path('')

      查詢結果:

 

1,張三 2,李四 3,王五

 

       看得出來,這個參數自動把我們的查詢結果串接在一起了,這下子,要做字符串拼接就很簡單了!

 

    

    4. 解答問題

           要查詢想要的結果,我們首先用一般的SQL語句,連接三個表之后的結果為:

 

 

   

select a.student_name,b.course_name from student_course c,student a,course b where              c.student_id=a.student_id and c.course_id=b.course_id

 

       查詢結果:

 

student_name course_name
張三 數學
張三 英語
李四 語文
李四 英語
王五 英語

 

      我們把這個查詢結果看作為一個臨時表,與自身進行一次連接,再得用FOR XML PATH('')參數來對課程course_name列進行拼接,再得用子查詢功能。這樣就得到一個每一個學生的所選的所有課程,由於上表會存在同一學生的多條記錄,所以需要對最后的結果按學生進行分組,先看看查詢語句:

        

復制代碼
select student_name,    (select course_name+',' from       (         select student_name,course_name from           (             select a.student_name,b.course_name from stud_course c,student a,course b where c.student_id=a.student_id and c.course_id=b.course_id          ) as a      ) as b where c.student_name=b.student_name for xml path('')    ) as course_name     from      (         select a.student_name,b.course_name from student_course c,student a,course b where c.student_id=a.student_id and c.course_id=b.course_id     ) as c  group by student_name
復制代碼

 

     查詢結果:

 

student_name course_name
張三 數學,英語,
李四 語言,英語,
王五 英語,

 

    

     還有個小問題, course_name后面多出一個,號,最后做一次裁剪,假設上面的SQL語句作為一個子查詢 subquery

 

select student_name,left(course_name,len(course_name)-1from (........) as subquery

   這樣,就可以得出最終的結果!可以看得出來FOR XML PATH('') 參數非常強大!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM