SQL IN условие - PullRequest
       3

SQL IN условие

12 голосов
/ 13 мая 2019
select transferTypes from TransferData 

transferTypes 
-------------
TTH, TT
TRANSIT, TTH
ST, TRANSIT
TRANSIT, TTH
ST, TT

Есть ли какой-либо способ или встроенная функция для достижения нижеуказанных результатов?

Пробовал с условием ниже IN, но не смог получить требуемые результаты.

Ожидаемый результат:

select transferTypes from TransferData where transferTypes in ('TT, ST')

transferTypes 
-------------
TTH, TT
ST, TRANSIT
ST, TT

select transferTypes from TransferData where transferTypes in ('TTH, TRANSIT')

transferTypes 
-------------
TTH, TT
TRANSIT, TTH
ST, TRANSIT
TRANSIT, TTH

select transferTypes from TransferData where transferTypes in ('TT')

transferTypes 
-------------
TTH, TT
ST, TT

Ответы [ 4 ]

13 голосов
/ 13 мая 2019

Самый простой способ - использовать string_split, который был представлен в SQL Server 2016 и более поздних версиях.

SELECT 
    DISTINCT a.transferTypes
FROM 
    TransferData a
CROSS APPLY 
    string_split([transferTypes], ',') b
WHERE 
    TRIM(b.[value]) IN ('TT', 'ST')

Приведенное выше разбивает все значения в transferTypes и позволяет осуществлять поиск по отдельным значениям.Если вы используете версию ниже SQL Server 2016, вы всегда можете создать функцию, которая будет делать то же самое (например, T-SQL, разделенная строка )

================================================

Небольшое объяснение того, что string_split делает :

string_split - это табличная функция, которая вкратце означает, что функция выведетТаблица.При наличии строкового ввода string_split выведет несколько строк подстрок на основе заданного вами разделителя.

Возьмем, например, следующее:

SELECT 
    *
FROM 
    string_split('String1;String2;String3', ';')

Приведенный выше код вернет три строкикак показано ниже:

Three string rows returned

Это очень мощный вопрос для первоначального вопроса, поскольку он позволяет фильтровать напрямую по отдельным значениям без необходимости использования CHARINDEXили LIKE.

3 голосов
/ 13 мая 2019

Сначала вам нужно преобразовать свои списки (в виде записей) в форму, которая начинается и заканчивается запятой и не содержит пробелов. Затем вы можете использовать charindex в сочетании с оператором or, чтобы проверить, указаны ли конкретные значения или включены в записи:

declare @TransferData  table (transferTypes varchar(20));
insert into @TransferData values
('TTH, TT'),
('TRANSIT, TTH'),
('ST, TRANSIT'),
('TRANSIT, TTH'),
('ST, TT');

select * from (
    select ',' + replace(transferTypes, ' ', '') + ',' transferTypes from @TransferData
) a
where charindex(',TT,', transferTypes) > 0
or charindex(',ST,', transferTypes) > 0
2 голосов
/ 20 мая 2019

Как насчет этого:

select 
  transferTypes 
from 
  TransferData 
where 
  transferTypes like '%TT%'
  or transferTypes like '%ST%'
2 голосов
/ 16 мая 2019

Вот пример того, как этого добиться.Используйте переменные, очевидные в выборках.Вы никогда не указывали, сколько элементов будет в вашем списке с разделителями, поэтому я полагаю, что на основе данных примера я делаю 2.

Если он варьируется, то, возможно, какая-то форма Dynamic SQL будет в порядке дня.

create table #transferdata
( 
 transferTypes  varchar(100) 
) 

insert into #transferdata select 'TTH, TT'
insert into #transferdata select 'TRANSIT, TTH'
insert into #transferdata select 'ST, TRANSIT'
insert into #transferdata select 'TRANSIT, TTH'
insert into #transferdata select  'ST, TT'


;WITH tmp AS
(
    SELECT

        LEFT(transferTypes , CHARINDEX(',', transferTypes  + ',') - 1) as col1 ,
        ltrim(STUFF(transferTypes , 1, CHARINDEX(',', transferTypes  + ','), '')) as col2
    FROM #transferdata

)
SELECT * into #tmp 
FROM tmp;

select * from #tmp as t where (t.col1 = 'tt' or t.col2 = 'tt') or (t.col1 = 'st' or t.col2 = 'st')
select * from #tmp as t where (t.col1 = 'tth' or t.col2 = 'tth') or (t.col1 = 'transit' or t.col2 = 'transit')
select * from #tmp as t where (t.col1 = 'tt' or t.col2 = 'tt') or (t.col1 = 'tt' or t.col2 = 'tt')


drop table #tmp
drop table #transferdata
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...