2016-09-15 8 views
1

У меня есть этот тип записи:запросов SQL Server В Операторе

Rajkot,Gandhinagar 

но я хочу выше запись должна быть изменена, как ниже запись.

'Rajkot','Gandhinagar' 

Как я хочу использовать оператор IN для получения результата.

+3

Вы не должны хранить несколько значений в столбце. Вместо этого используйте таблицу соединений. –

+0

'SELECT '' '' + REPLACE ('Rajkot, Gandhinagar', ',', '' ',' '') + '' ''' – gofr1

+0

@ gofr1 Я предполагаю, что он имел в виду нечто общее. – sagi

ответ

2

Обратите внимание, что использование соединительной таблицы обычно будет лучше, как указано в комментариях.

Тем не менее, если предположить, что вы застряли с дизайном:

TableA 
ID  ValueList 
1  Uno,Dos,Tres 
2  Foo,Bar,Baz,Quux 

И вы хотите, чтобы сделать эквивалент этого:

Select * 
from TableA a 
where @Value in ValueList -- ERROR 

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

Select * 
from TableA a 
where ','+ValueList+',' like '%,'[email protected]+',%' 

Если вы хочу сделать это:

select * 
from TableA b 
where b.Value in (select ValueList from TableA a where a.ID = b.ID) 

Try:

select * 
from TableB b 
where exists (
    select 1 from TableA a 
    where a.ID = b.ID and ','+a.ValueList+',' like '%,'+b.Value+',%' 
) 

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

  • TableA очень мал и имеет очень мало строк (например, < 10 строки). Это связано с тем, что если данные вписываются в одну или две страницы, накладные расходы, связанные с поиском индекса, могут быть больше, чем накладные расходы, связанные с простое сканирование страницы и выполнение сравнения строк.

  • Или на самом деле выполняется поиск только небольшого подмножества строк.

  • Например, если вы просматриваете отдельные строки по уникальному ключу или несколько десятков строк эффективным индексом и просто хотите фильтровать на основе того, есть ли строка в ValueList, это может быть быстрее, чем таблицу соединений, поскольку данные хранятся на одной странице.

  • Он также может быть быстрее, чем фильтрация на стороне клиента (поскольку строки, которые не проходят тест, не должны возвращаться клиенту).

Другими словами, если вы не поиск значениями из этого списка, а просто фильтрации на них, это может быть не стоит поместить их в таблицу соединения.

Как всегда одна не должен быть догматическим о дизайне, но теста.

0

Код:

select ''''+substring('Rajkot,Gandhinagar',1,charindex(',','Rajkot,Gandhinagar',0)-1)+'''' + ',' +''''+ 
     substring('Rajkot,Gandhinagar',charindex(',','Rajkot,Gandhinagar',0)+1,len('Rajkot,Gandhinagar'))+'''' 
Смежные вопросы