Sql server LIKE Оператор с разделенной запятой строкой
Моя хранимая процедура получает параметр, который представляет собой строку, разделенную запятыми:
DECLARE @review_status varchar(200) SET @review_status='CANCELLED,INSPECTED,REJECTED,UNASSIGNED'
Я использую эту переменную с LIKE Operator, когда значение без запятой тогда совершенное, но оно имеет запятую, а затем неспособно обрабатывать. Теперь я использую это утверждение
SELECT * FROM tblReview WHERE review_status LIKE '%' + @review_status + '%'
Мне нужно сделать из этого это утверждение
SELECT * FROM tblReview WHERE review_status LIKE '%CANCELLED%' OR --Pass @review_status review_status LIKE '%INSPECTED%' OR review_status LIKE '%REJECTED%'.....
Какова наилучшая практика для этого?
Для этого вы можете использовать разделитель строк. Прочтите эту статью для одного из самых быстрых сплиттеров.
Затем вам нужно использовать оператор IN
для фильтрации:
SELECT * FROM tblReview WHERE review_status IN( SELECT item FROM dbo.DelimitedSplit8K(@review_status,',') )
Поскольку вы используете LIKE
, вы можете сделать JOIN
вместо IN
:
SELECT * FROM tblReview t INNER JOIN dbo.DelimitedSplit8K(@review_status, ',') s ON t.review_status LIKE '%' + s.Item + '%'
Попробуйте сначала преобразовать varchar с запятыми в таблицу, как описано здесь http://blogs.msdn.com/b/amitjet/archive/2009/12/11/sql-server-comma-separated-string-to-table.aspx , Затем используйте следующее:
CREATE TABLE #allPattern ( pattern NVARCHAR(max) ); INSERT INTO #allPattern VALUES ('%CANCELLED%'), ('%INSPECTED%'), ('%REJECTED%'); SELECT t.* FROM tblReview t JOIN #allPattern a ON (t.review_status LIKE a.pattern);
Вы можете добавить CHARINDEX()
и CHARINDEX()
запятую к вашей строке, а затем использовать CHARINDEX()
.
SET @review_status=',CANCELLED,INSPECTED,REJECTED,UNASSIGNED,' SELECT * FROM tblReview WHERE charindex(','+review_status+',', '@review_status') >0
Запятые в начале и в конце строки используются, чтобы сделать точную строку поиска возможной – например, если у вас есть два состояния – один называется CAN, а второй называется CANCELED, charindex без боковых запятых найдет их обоих.
Это самый простой способ, но не тот, который имеет лучшую производительность, поэтому не используйте его на длинных CSV-файлах.