logo MSJO.kr

SQL, Convert Comma Separated String to Table

2019-08-14
MsJ

예전 글 ‘ASP.NET MVC, Delete Multiple Rows With Checkbox’에서 SQL의 ‘where’ 구문의 조건으로 ‘in’ list에 테이블 변수(타입)를 대입해서 한 번에 여러 Row를 처리하는 쿼리를 살펴보았다. 이때 선행조건으로 테이블 타입을 생성해야만 하는데 이번에는 IN list에 콤마로 구분된 스트링이 변수로 입력되었을 때도 동일한 기능을 수행하는 사용자 함수를 만들어 사용해보자. 참고로 SQL Server 2016 버전 이상은 ‘STRING_SPLIT’라는 함수를 이미 제공하고 있다.

-- 사용예 : 함수명(StringSplit)
@SomeStrings = 'abc, 가나다, 123'
delete from SomeTable where ID in (select value from StringSplit(@SomeStrings, ','))
함수만들기 : StringSplit
CREATE FUNCTION dbo.StringSplit (@InputString varchar(8000), @Delimiter char(1))
RETURNS @ReturnTable Table (value varchar(100))
AS
BEGIN
    declare @TempString varchar(100)
    while len(@InputString) > 0
    begin
    	set @TempString = rtrim(ltrim(left(@InputString, isnull(nullif(charindex(@Delimiter, @InputString) - 1, -1), len(@InputString)))))
        set @InputString = substring(@InputString, isnull(nullif(charindex(@Delimiter, @InputString), 0), len(@InputString)) + 1, len(@InputString))
        if @TempString <> ''
        insert into @ReturnTable values (@TempString)	
    end
    return 	
END
오라클 사용예
select * from SomeTable where ID in (
select regexp_substr('abc,가나다,123','[^,]+', 1, level) from dual
connect by regexp_substr('abc,가나다,123', '[^,]+', 1, level) is not null);
Reference

Prεv(Θld)   Nεxt(Nεw)
Content
Search     RSS Feed     BY-NC-ND