2009-10-24 5 views
3

У меня есть одна таблица с конкретными столбцами, в которой есть столбец, который содержит значения, разделенные запятой, такие как test, exam, result, other.Как сравнить два значения столбца, которые являются значениями, разделенными запятой?

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

Для примера:

TABLEA

ID  Name    Words 
1   samson    test,exam,result,other 
2   john    sample,no query 
3   smith    tester,SE 

Теперь я хочу, чтобы искать результат, образец, неизвестно, дополнительные функции

Тогда результат должен быть

ID  Name    Words 
1   samson    test,exam,result,other 
2   john    sample,no query 

, потому что в первой записи результат соответствует и во второй записи образец соответствует.

+1

какой двигатель sql вы используете? –

+5

Я бы посмотрел на исправление моего дизайна базы данных. – Joe

+0

Как вы просите людей, у которых есть «тест, экзамен, результат, другой», как точно результат? Это неоптимальный дизайн. –

ответ

1

Лично я думаю, что вы хотите посмотреть на свое приложение/архитектуру и тщательно подумать о том, действительно ли вы хотите сделать это в базе данных или приложении. Если это не подходит или нет, тогда вам нужно создать пользовательскую функцию. Код в этой статье здесь должно быть достаточно легко изменить, чтобы сделать то, что вы хотите:

Quick T-Sql to parse a delimited string (также посмотреть на код в комментариях)

7

Это не большой проект, вы знаете. Лучше разделить слова на отдельную таблицу (id, word).

Тем не менее, это должно сделать трюк:

set nocount on 
declare @words varchar(max) = 'result,sample,unknown,extras' 

declare @split table (word varchar(64)) 
declare @word varchar(64), @start int, @end int, @stop int 

-- string split in 8 lines 
select @words += ',', @start = 1, @stop = len(@words)+1 
while @start < @stop begin 
    select 
    @end = charindex(',',@words,@start) 
    , @word = rtrim(ltrim(substring(@words,@start,@[email protected]))) 
    , @start = @end+1 
    insert @split values (@word) 
end 

select * from TableA a 
where exists (
    select * from @split w 
    where charindex(','+w.word+',',','+a.words+',') > 0 
) 

Могу ли я гореть в аду DBA для предоставления вам это!

Редактировать: заменено STUFF w/SUBSTRING нарезка, на порядок выше по длинным спискам.

+0

Рассматривать факел под костром освещен, Питер ...: D –

+1

Хех.Я думаю, что хорошо, что вы опубликовали это, служит хорошей иллюстрацией того, почему так не нужно разрабатывать вещи. – SquareCog

+2

Я согласен с тем, что дизайн может быть выполнен правильно, но, к сожалению, некоторые из нас могут застрять в подобных проблемах и не могут позволить себе изменить плохой дизайн. Спасибо за публикацию! :) – Ryan

0

Как уже говорили другие, у вас есть плохой дизайн. Подумайте об использовании правильных отношений для представления этих вещей.

Это, как говорится, вот подробная статья о том, как это сделать с помощью SQL Server: http://www.sommarskog.se/arrays-in-sql-2005.html

Одна вещь, никто не охватывает до сих пор, потому что это часто очень плохая идея, - но потом, вы уже работая с плохой идеей, а иногда и с двумя неправильными правами - извлекает все строки, которые соответствуют ЛЮБОЙ из ваших строк (используя LIKE или некоторые из них) и выполняют перекрестку самостоятельно, на стороне клиента. Если ваши строки довольно редки и сильно коррелированы, это может работать очень хорошо; это будет ужасно ужасно в большинстве других случаев.