2015-02-12 2 views
0

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

id| name | valueslist 
---------------------------------------------- 
1 | John | 46423423,36456325,76473234,98798796 
2 | Mike | 36456325,98798796 
3 | Sara | 46423423 

У меня есть параметр мульти-значение, основанный на наборе данных, в котором перечислены все возможные идентификаторы

param: @chosenvalues 
    possible values: 
    46423423 
    36456325 
    76473234 
    98798796 

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

например:

If I select 36456325 I need John & Mike to be returned 
If I select 46423423 I need John & Sara to be returned 
If I select 46423423 & 98798796 I need all three to be returned 

Я думал, что я мог бы решить эту проблему, как

SELECT * FROM table WHERE '%' + valueslist + '%' IN ('%' + @chosenvalues + '%') 

, но это не работает. Любые предложения относительно того, как я могу это решить?

ТИА,

Henro

редактировать: Я знаю, что это на самом деле далеко от идеального моделирования, но, к сожалению, это то, что я должен работать.

+4

Вы должны исправить структуру данных, чтобы иметь турный ионный стол. SQL имеет эту отличную структуру данных для хранения списков вещей - она ​​называется таблицей, а не строкой. –

+0

Невероятно, как часто появляются эти типы вопросов. Плохое моделирование данных - это корень всего зла! – Dan

ответ

2

Пожалуйста, попробуйте следующий SQL Select заявление

/* 
create table valueslisttbl (id smallint, name varchar(20), valueslist varchar(1000)) 
insert into valueslisttbl values 
(1, 'John', '46423423,36456325,76473234,98798796'), 
(2, 'Mike', '36456325,98798796'), 
(3, 'Sara', '46423423') 
*/ 

declare @chosenvalues varchar(100) 
--set @chosenvalues = '46423423' 
--set @chosenvalues = '36456325' 
--set @chosenvalues = '76473234' 
set @chosenvalues = '46423423,98798796' 

select distinct name 
from valueslisttbl 
cross apply dbo.Split(valueslisttbl.valueslist, ',') s 
where s.val in (
    select val from dbo.Split(@chosenvalues, ',') 
) 

Также обратите внимание, что вам нужно SQL Split function для того, чтобы решить ваши требования

Я использовал SQL XML для функции разделенного сервера выше SQL, где вы можете найти исходные коды SQL в http://www.kodyaz.com/articles/t-sql-convert-split-delimeted-string-as-rows-using-xml.aspx

Я надеюсь, что это помогает,

+0

Другая альтернатива функции разделения: http://www.sqlservercentral.com/articles/Tally+Table/72993/ – mheptinstall

1

И вдруг меня поразила молния, и идея пришла ко мне в ослепительной вспышке гения. (Ну, это FELT так или иначе)

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

SELECT DISTINCT j.* 
FROM tableJohn j 
LEFT JOIN Table_Solutions s on '%'+ s.value + '%' LIKE j.valuelist 
WHERE s.value in (@chosen_values) 

@chosen_values ​​теперь мог хорошо заполняться со значениями от параметра многозначного в отчете SSRS.

Смежные вопросы