Helpex - Trao đổi & giúp đỡ Đăng nhập

Tách chuỗi trong máy chủ sql

Vũ Mỹ Loan
· 10:42 29/01/2014
hôm qua

Tôi có một chuỗi trong cơ sở dữ liệu được phân tách bằng dấu phẩy, chẳng hạn như 'táo, chuối, dứa, nho', tôi cần chia chuỗi này trên cơ sở dấu phẩy và lặp lại qua chuỗi này. Vì không có hàm tích hợp sẵn trong máy chủ sql, Is có bất kỳ cách hiệu quả nào để đạt được mục tiêu này.

17 hữu ích 2 bình luận 73k xem chia sẻ
Nguyễn Tâm Đan
· 10:48 29/01/2014
10:48:28 29/01/2014

Hãy thử chức năng này

CREATE FUNCTION [dbo].[func_Split] 
    (   
    @DelimitedString    varchar(8000),
    @Delimiter              varchar(100) 
    )
RETURNS @tblArray TABLE
    (
    ElementID   int IDENTITY(1,1),  -- Array index
    Element     varchar(1000)               -- Array element contents
    )
AS
BEGIN

    -- Local Variable Declarations
    -- ---------------------------
    DECLARE @Index      smallint,
                    @Start      smallint,
                    @DelSize    smallint

    SET @DelSize = LEN(@Delimiter)

    -- Loop through source string and add elements to destination table array
    -- ----------------------------------------------------------------------
    WHILE LEN(@DelimitedString) > 0
    BEGIN

        SET @Index = CHARINDEX(@Delimiter, @DelimitedString)

        IF @Index = 0
            BEGIN

                INSERT INTO
                    @tblArray 
                    (Element)
                VALUES
                    (LTRIM(RTRIM(@DelimitedString)))

                BREAK
            END
        ELSE
            BEGIN

                INSERT INTO
                    @tblArray 
                    (Element)
                VALUES
                    (LTRIM(RTRIM(SUBSTRING(@DelimitedString, 1,@Index - 1))))

                SET @Start = @Index + @DelSize
                SET @DelimitedString = SUBSTRING(@DelimitedString, @Start , LEN(@DelimitedString) - @Start + 1)

            END
    END

    RETURN
END

Cách sử dụng ví dụ - chỉ cần chuyển cho hàm chuỗi được phân cách bằng dấu phẩy cũng như dấu phân cách được yêu cầu của bạn.

DECLARE @SQLStr varchar(100)
SELECT @SQLStr = 'Mickey Mouse, Goofy, Donald Duck, Pluto, Minnie Mouse'

SELECT
    *
FROM
    dbo.func_split(@SQLStr, ',')

Kết quả sẽ như thế này

Tách chuỗi trong máy chủ sql

30 hữu ích 3 bình luận chia sẻ
Lê Cát Uy
· 20:38 19/03/2016
20:38:54 19/03/2016

... Vì không có chức năng tích hợp trong máy chủ sql ...

Điều đó đúng vào thời điểm bạn hỏi câu hỏi này nhưng SQL Server 2016 giới thiệu STRING_SPLIT.

Vì vậy, bạn chỉ có thể sử dụng

SELECT value
FROM   STRING_SPLIT ('apple,banana,pineapple,grapes', ',') 

Có một số hạn chế (chỉ chấp nhận các dấu phân cách ký tự đơn và thiếu bất kỳ cột nào cho thấy chỉ mục phân tách là bắt mắt nhất). Các hạn chế khác nhau và một số kết quả đầy hứa hẹn của thử nghiệm hiệu suất có trong bài đăng trên blog này của Aaron Bertrand .

16 hữu ích 0 bình luận chia sẻ
Phạm Nhã Khanh
· 11:14 29/01/2014
11:14:01 29/01/2014

Bạn có thể chuyển đổi dữ liệu của mình sang XML, bằng cách thay thế dấu phẩy bằng thẻ tùy chỉnh, trong trường hợp này là <w>từng chữ.

create table t(col varchar(255));
insert into t values ('apple,banana,pineapple,grapes');
insert into t values ('car,bike,airplane');

select cast(('<w>' + replace(col, ',', '</w><w>') + '</w>') as xml) as xmlValue
  from t

Cái nào trả về

|                                               XMLVALUE |
|--------------------------------------------------------|
| <w>apple</w><w>banana</w><w>pineapple</w><w>grapes</w> |
|                   <w>car</w><w>bike</w><w>airplane</w> |

Bây giờ, nếu bạn sử dụng truy vấn này như một lựa chọn xml bên trong, thì truy vấn bên ngoài có thể chia nó thành các hàng riêng biệt:

Giải pháp:

select split.xmlTable.value('.', 'varchar(255)') as xmlValue
from (

   select cast(('<w>' + replace(col, ',', '</w><w>') + '</w>') as xml) as xmlValue
     from t

) as xmlTable
cross apply xmlValue.nodes ('/w') as split(xmlTable);

SqlFiddle trực tiếp

6 hữu ích 0 bình luận chia sẻ
Dương Ngọc Điệp
· 14:38 23/04/2019
14:38:12 23/04/2019

Tôi có một giải pháp bằng cách sử dụng Đệ quy như sau

Create function split_string(@str as nvarchar(max),@separator as char(1)) returns @myvalues Table (id int identity(1,1),myval nvarchar(100))
as 
--Kamel Gazzah
--23/04/2019
begin
with cte as(
select @str [mystr],
cast(1 as int) [Start],
charindex(@separator,@str)as Nd
union all
select substring(@str,nd+1,len(@str)),cast(Nd+1 as int),charindex(@separator,@str,Nd+1) from cte
where nd>0
)
insert into @myvalues(myval) 
select case when nd>0 then substring(@str,start,Nd-start) 
else substring(@str,start,len(@str)) end [splitted] 
from cte   OPTION (MAXRECURSION 1000);
return ;
end;

Bạn có thể gọi chức năng này

select * from split_string('apple,banana,pineapple,grapes',',')
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ sql sql server database string , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm