2014-09-09 2 views
2

Здесь мне нужно проверить строку, которая находится в формате 'a,c,e'. Эта ситуация возникла, когда пользователь выбрал несколько опций из флажка и в запросе, который мне нужен, чтобы проверить его с текущим столбцом.Проверить строку в инструкции select с помощью SQL Server 2008

Пример:

Учитывая строку:

'a,c,e' 

Необходимо проверить данную строку каждое слово присутствует в колонке columnA или нет:

columnA columnB 
------------------- 
a   1 
b   2 
c   3 
d   4 
e   5 
f   6 
g   7 
h   8 

Если a,c,e присутствует в столбец columnA он должен получить с помощью columnB:

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

columnA columnB 
------------------ 
a   1 
c   3 
e   5 

Моя попытка:

select columnA,columnB from 
test where columnA ='a' 
or columnA = 'c' 
or columnA = 'e' 

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

+1

Этот вопрос в порядке. Это так же оптимально, как и будет, если в столбце A есть индексы. Альтернативно, его можно выразить как «где columnA IN ('a', 'c', 'e')'; но это будет * не * сделать его «более оптимизированным» .. и я понятия не имею, к чему относится «значение строки .. изменения одновременно». – user2864740

+0

@ пользователь2864740, Yup! Огромное спасибо. – Meem

+0

Метод будет работать, если на входе определен статический a, c, e .. но если вы говорите о динамическом вводе, то? – masum7

ответ

2

Try ниже код :

DECLARE @COMMASEPSTR NVARCHAR(200), @SQL nvarchar(max), @STR nvarchar(100) = 'a,b,c' 
SET @COMMASEPSTR= '''' + REPLACE(@STR,',',''',''') + '''' 

SET @SQL = 'select columnA,columnB from 
test where columnA IN (' + @COMMASEPSTR + ')' 
EXEC sp_executesql @SQL 

Сообщите мне, если я где-то не прав.

+0

Отлично! Вы абсолютно правы, большое вам спасибо. – Meem

+2

Рад помочь вам ... :) – Dhwani

1

Вы можете использовать синтаксис:

select columnA,columnB from 
test where columnA IN ('a','b','c') 
2

Я не уверен в формате динамического ввода строки или формата Columna, но вы можете попробовать это:

select columnA,columnB from 
test where CHARINDEX(columnA, 'a,c,e')>0 
+0

Этот метод никогда не сможет использовать индексы, я бы не рекомендовал его. – user2864740

+0

В зависимости от вопроса строка ввода может отличаться. Значит, он может быть динамическим – masum7

+0

True; Я все равно переместил бы синтаксический разбор строки на соответствующий SQL-запрос на прикладной уровень. Это делает то, что вам не нужно (для лень, если ничего больше ;-) – user2864740

0

попробуйте сделать ур жизнь проще, введите строку ввода перед столбцом в инструкции выбора.

declare @temp table 
(
ColumnA NVARCHAR(MAX), 
ColumnB NVARCHAR(MAX) 
) 


insert into @temp 
select 'a','1' 
union all 
select 'b','2' 
union all 
select 'c','3' 
union all 
select 'd','4' 
union all 
select 'e','5' 
union all 
select 'f','6' 
union all 
select 'g','7' 

DECLARE @input NVARCHAR(MAX) 
SET @input= 'a,d,c' 

select * from @temp where @input like '%' + ColumnA +'%' 
Смежные вопросы