Hỏi Đáp SQL------------ Không có câu hỏi nào là sơ đẳng --------

Chuyển chuỗi thành dòng với hàm parsename()

Chuyển chuỗi thành dòng là nhu cầu khá phổ biến trong lập trình CSDL. Và có lẽ các bạn cũng đã biết giải pháp cho yêu cầu này, đó là sử dụng hàm phụ trợ để cắt chuỗi, chuyển thành bảng cho từng chuỗi. Hàm này có rất nhiều trên mạng với nhiều cách thức khác nhau, mà tên phổ biến là "split".

Tuy nhiên, điểm yếu phổ biến của tất cả hàm split này là tốc độ truy xuất rất chậm, nhất là khi bảng lên đến ngàn hay triệu dòng. Giả sử bảng có 1000 dòng, thì hàm split phải tạo ra 1000 bảng tạm khác nhau, tách bóc chuỗi, bỏ dữ liệu vào bảng tạm, rồi trả về cho bảng chính. Chắc bạn cũng thấy nó tốn kém thế nào. Đây là rắc rối chung cho mọi lập trình SQL chứ chẳng phải riêng bạn.

Bạn có giải pháp khác với tốc độ truy xuất cao hơn hẳn, sử dụng hàm parsename(). Hàm này được xây dựng sẵn trong hệ thống. Bạn chẳng cần phải làm gì cả, chỉ sử dụng nó 1 cách thích hợp.

Giới hạn :
1- hàm parsename() sử dụng dấu ".", nên bạn phải chuyển đổi trong câu lệnh.
2- hàm parsename() chỉ áp dụng cho chuỗi có tối đa 4 phần tử(đây là giới hạn lớn nhất)

Nếu yêu cầu của bạn là áp dụng cho chuỗi có hơn 4 phần tử, bạn vẫn phải sử dụng phương pháp cũ bằng hàm split

Nếu chuỗi của bản chỉ có tối đa 4 phần tử, giải pháp với hàm parsename là sự lựa chọn tốt nhất.

Dưới đây là ví dụ sử dụng


Và đây là toàn bộ mã cho bạn chạy thử

declare @temp table(MaDong int identity, Chuoi varchar(200))
insert into @temp values('a,b,c'),('a,b'),('1,3,c'),('2,a,b,c'),('a,b,c,v')
select * from @temp

select * from @temp t 
outer apply
(
select * from 
(
values
(parsename(replace(t.Chuoi, ',','.'),4)), 
(parsename(replace(t.Chuoi, ',','.'),3)),
(parsename(replace(t.Chuoi, ',','.'),2)),
(parsename(replace(t.Chuoi, ',','.'),1))
)
temp(PhanTu) where PhanTu is not null
)oa


Nếu bạn muốn biết số thứ tự của phần tử trong chuỗi, bạn cần thêm chút thủ thuật như ví dụ dưới đây


Không có nhận xét nào:

Đăng nhận xét