Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка данных по списку целых значений, разделённых ','  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 479
Доброго всем времени суток!
Есть таблица, в строковом поле которой хранятся числа (натуральные), разделённые запятой.
Каким образом можно выбрать все строки этой таблицы, которые содержат хотя бы одно число из передаваемого как парамтер списка?

Ниже, задачи описание "на пальцах":
Есть поле ResourceIdsStr c такими значениями:

ResourseIDsStr
1
15,8
1,6,15
12
5


При передаче параметра
'6,7,12,15'
функции/процедуре и её выполнении, на выходе должен получится следующий набор данных

ResourseIDsStr
15,8
1,6,15
12

потому как в каждой строке результирующего набора данных присутствует хотя-бы одно число из списка, передаваемого как параметр.
14 июл 16, 16:00    [19409842]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Romka-Fes,

почему параметр строковый, а не табличная переменная?
14 июл 16, 16:07    [19409874]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
https://blogs.msdn.microsoft.com/amitjet/2009/12/11/convert-comma-separated-string-to-table-4-different-approaches/
14 июл 16, 16:07    [19409875]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 479
Потому что клиент написан на Delphi, он (поправьте меня) как бы не умеет таблицы в параметры запроса пихать.
Но наличие табличной переменной с данными решается в самой процедуре очень просто:
	
        declare @WorkerIDs table (WorkerID int) --табличная переменная с натуральными значениями (по одному) в каждой строке
        IF isnull(@WorkerIDStr,'') = ''  --а это строковый параметр с числами через запятую.
	BEGIN
		INSERT INTO @WorkerIDs SELECT nid FROM dbo.Workers ORDER BY F
	END
	ELSE
	BEGIN
		declare @sql nvarchar (max)

		SET @sql = '  SELECT nid FROM dbo.Workers WHERE nid in ( ' + @WorkerIDStr + ') ORDER BY F'
		
		INSERT INTO @WorkerIDs
		exec (@sql)
		
	END

Так что "виртуально" можно полагать, что в SP MS SQL Server уже был передан параметр типа "табличная переменная" с названием
@WorkerIDs
14 июл 16, 16:12    [19409890]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 479
3unknown
https://blogs.msdn.microsoft.com/amitjet/2009/12/11/convert-comma-separated-string-to-table-4-different-approaches/

И..... ?
Как список, разделённых запятой чисел (в моём частном случае) проще всего преобразовать в табличную переменную, я указал в своём посте выше.
Суть моего вопроса заключалась не в этом.
У меня же таблица для выборки содержит не числа, а такие же строки, в которых числа, разделённые запятой.
14 июл 16, 16:16    [19409910]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
Студент123,
Guest
Romka-Fes
3unknown
https://blogs.msdn.microsoft.com/amitjet/2009/12/11/convert-comma-separated-string-to-table-4-different-approaches/

И..... ?

Гугл помер =)

https://www.sql.ru/forum/1144673/proverka-vhozhdeniya-podmnozhestvo-v-mnozhestvo?hl=????????????
14 июл 16, 16:27    [19409989]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
Romka-Fes
Так что "виртуально" можно полагать, что в SP MS SQL Server уже был передан параметр типа "табличная переменная" с названием
@WorkerIDs
Ну тогда всё просто.
select * 
from T
where exists(
    select * from @WorkerIDs i where ','+T.ResourceIdsStr+',' like '%,' + convert(varchar, i.WorkerID) + ',%')
14 июл 16, 16:31    [19410018]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Romka-Fes
поправьте меня
Поправляю.
У меня пихает!
Правда, от версии сервера зависит.
14 июл 16, 16:34    [19410037]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 479
alexeyvg,

Просто, потому что гениально!
Спасибо!
14 июл 16, 16:39    [19410089]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 479
iap
Romka-Fes
поправьте меня
Поправляю.
У меня пихает!
Правда, от версии сервера зависит.

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

А какой тип для передачи табличной переменной Вы используете на стороне Delphi?
14 июл 16, 16:40    [19410107]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
CREATE FUNCTION dbo.Split ( @strString varchar(4000))
RETURNS @Result TABLE(Value BIGINT)
AS
begin
WITH StrCTE(start, stop) AS
(
SELECT 1, CHARINDEX(',' , @strString )
UNION ALL
SELECT stop + 1, CHARINDEX(',' ,@strString , stop + 1)
FROM StrCTE
WHERE stop > 0
)

insert into @Result
SELECT SUBSTRING(@strString , start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS stringValue
FROM StrCTE

return
end


GO

Create table #tmp(id int identity(1,1),val varchar(100))

declare @par varchar(100) = '6,7,12,15'

insert #tmp(val)
values('1'),
('15,8'),
('1,6,15'),
('12'),
('5')

select val
from(
select id
,val
,(select top 1 value from dbo.Split (val) where value in (select value from dbo.Split(@par))) res
from #tmp) a
where res is not null
14 июл 16, 16:41    [19410115]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по списку целых значений, разделённых ','  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Romka-Fes
iap
пропущено...
Поправляю.
У меня пихает!
Правда, от версии сервера зависит.

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

А какой тип для передачи табличной переменной Вы используете на стороне Delphi?
Писал SQL в TADOQuery, например.
А там объявлял переменную заранее созданного на сервере типа,
заполнял её insertами, формировал вызов процедуры с параметром упомянутого выше типа.

Может, можно и более правильно делать...
14 июл 16, 16:45    [19410144]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить