예전 글 ‘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
- Microsoft, STRING_SPLIT(Transact-SQL)
- StackOverflow, How to convert comma separated NVARCHAR to table records
- ASPSnippets, Split and convert Comma Separated (Delimited) String to Table
- MSDN, Convert Comma Separated String to Table : 4 different approaches
- Oracle, How to split comma separated string to IN clause of select statement
- StackOverflow, How to convert comma separated values to rows in oracle?
- StackOverflow, Splitting string into multiple rows in Oracle