Разделить строку, которая будет использоваться в операторе IN

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть SQL-запрос, подобный этому:

 Declare @SuspendedTo varchar(100) = 'Processing,Personal Service'
Select @SuspendedTo
Select top 100 SuspendedTo, *
from #temp_SuspenseResults
where SuspendedTo in (@SuspendedTo)
 

Проблема с этим запросом заключается в том, что @SuspendedTo он рассматривается как одна строка, и это не возвращает никаких результатов. Как мне разделить @SuspendedTo ее так, чтобы я получил следующий запрос:

 Select top 100 SuspendedTo, *
from #temp_SuspenseResults
where SuspendedTo in ('Processing', 'Personal Service')
 

Ответ №1:

Вы можете использовать string_split() :

 Select top 100 SuspendedTo, sr.*
from #temp_SuspenseResults sr
where sr.SuspendedTo in (select value from string_split(@SuspendedTo, ','))
 

Ответ №2:

Попробуйте это:

 Declare @SuspendedTo varchar(100) = 'Processing,Personal Service'

Select @SuspendedTo

Select top 100 SuspendedTo, *
from #temp_SuspenseResults
OUTER APPLY STRING_SPLIT(@SuspendedTo,',') s
where SuspendedTo in (s.value)
 

Также мы можем добиться того же, используя узлы XML

 Declare @SuspendedTo varchar(100) = 'Processing,Personal Service'

DECLARE @SuspendedToXML XML=cast('<r>' replace(@SuspendedTo, ',', '</r><r>') '</r>' as xml)

Select top 100 SuspendedTo, *
from #temp_SuspenseResults
INNER JOIN (                    
                   SELECT r.value('.', 'varchar(50)') Location_id                    
                   FROM @SuspendedToXML.nodes('r') AS fn(r)                    
                   ) AS X ON X.Location_id =SuspendedTo