Как сравнить два значения столбца, которые являются значениями, разделенными запятыми? - PullRequest
3 голосов
/ 24 октября 2009

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

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

Например:

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

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

Ответы [ 3 ]

7 голосов
/ 24 октября 2009

Знаете, это не очень хороший дизайн. Лучше разбить слова на отдельные таблицы (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,@end-@start)))
  , @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, на порядок быстрее в длинных списках.

1 голос
/ 24 октября 2009

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

Быстрый T-Sql для разбора строки с разделителями (также посмотрите код в комментариях)

0 голосов
/ 25 октября 2009

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

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

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

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