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

Откуда: Ставрополь
Сообщений: 15
Здравствуйте, уважаемые гуру T-SQL
Помогите, пожалуйста, с запросом.

Таблица Table1
Поля:
NUMB_P float not null
V1 varchar(4) not null
V2 varchar(32) not null

Поле V1 заполнено примерно такими значениями: '1001', '1002','1003','3001','4001','4005','5003' ну и т.п. всего порядка 30 таких значений.
Поле V2 может быть заполнено: '0' (ноль) либо '4001'(одиночное значение кода из перечня V1) либо '4005,1002'(два или более кодов V1, разделённых запятой)

Запрос используется в Table-valued функции.
Параметр функции @sV varchar(max).
В качестве параметра будет передаваться строка вида '1002,4001,5007'
Надо выбрать записи, в которых коды из списка, переданного в параметре, содержаться в поле V1 ИЛИ V2.

Прошу прощения за скверное оформление вопроса.
Заранее благодарю.

Версия SQLServer - 2008 R2 (SP1)
18 дек 12, 17:15    [13650066]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
aleks2
Guest
CREATE function [dbo].[StrToTable](@str varchar(8000), @delimiter varchar(64)=',')
returns table as
return(
WITH str_nums ( n1, n2, Number ) 
AS 
( 
select  1-DATALENGTH(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number  
UNION ALL 
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+DATALENGTH(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH(@str)
) 
SELECT SUBSTRING(@str, n1+DATALENGTH(@delimiter), n2-n1-DATALENGTH(@delimiter)) as Value, Number, n1+DATALENGTH(@delimiter) as StartPosition FROM str_nums
)
18 дек 12, 17:35    [13650221]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
pavel1311
Member

Откуда: Ставрополь
Сообщений: 15
aleks2, Спасибо!
Только пока я смог по полю V1 выбрать. Никак не могу сообразить как сравнивать с V2...
...
WHERE 
      V1 IN (SELECT Value FROM dbo/StrToTable (@sV, ','))
OR ... ???
 

Прошу ещё помочь.
19 дек 12, 09:42    [13652084]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Т.к. все равно будет скан всей таблицы, то в качестве варианта:
declare @sV varchar(100) = '1002,4001,5007';

select
 @sV = '%,' + replace(@v, ',', ',%,') + ',%';
 
select @v;

select
 ...
from
 dbo.Table1
where
 ',' + V1 + ',' like @sV or
 ',' + V2 + ',' like @sV
19 дек 12, 12:23    [13653168]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
pavel1311
Member

Откуда: Ставрополь
Сообщений: 15
invm, не получается. Работает только для входного параметра с одним кодом, типа '1002', с '1002,4001' уже ничего не выбирает...
20 дек 12, 10:28    [13658054]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
declare @p varchar(100) = '1002,4001,5007';

declare @t table (V1 varchar(1000), V2 varchar(1000));
insert into @t
values
 ('33,1002,1,2,3,4001,5,5007,17,19', ''),
 (null, '1002,1,2,3,4001,5007,17,19');

select
 @p = '%,' + replace(@p, ',', ',%,') + ',%';
 
select
 @p, *
from
 @t
where
 ',' + replace(V1, ',', ',,') + ',' like @p or
 ',' + replace(V2, ',', ',,') + ',' like @p
20 дек 12, 10:59    [13658254]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
Гость333
Member

Откуда:
Сообщений: 3683
invm
declare @p varchar(100) = '1002,4001,5007';

А теперь представим, что значения в @p идут в другом порядке :-)
declare @p varchar(100) = '4001,1002,5007';

Ваш запрос тогда не вернёт ни одного значения...
20 дек 12, 11:06    [13658299]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Сколько плясок с бубнами!
А всё из-за того, что кого-то озарила гениальная идея - хранить в поле список через запятую,
в то время как постоянно требуется доставать отдельные члены этого списка!
Ну да, нормализацию придумали лохи для чайников!

pavel1311, сделайте отдельную таблицу для хранения элементов списка в своих собственных записях.
И всё! Сразу полегчает, вот увидите.

Да! И сразу бросается в глаза тип FLOAT. Он Вам действительно так нужен?
Рассмотрите возможность замены этого типа на DEC()
20 дек 12, 11:21    [13658402]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
pavel1311
Member

Откуда: Ставрополь
Сообщений: 15
invm, не получается ...
Извиняюсь за то, что не привел пример таблицы...
Позволю себе напомнить условия: V1 заполнено ТОЛЬКО одиночным кодом, V2 имеет 3 варианта заполнения: '0' (ноль) либо '4001'(одиночное значение кода из перечня V1) либо '4005,1002'(два или более кодов V1, разделённых запятой)
Вот скрипт для заполнения таблицы:
declare @t table (V1 varchar(1000) not null, V2 varchar(1000) not null);
insert into @t
values
 ('1002', '0'),
 ('5007', '4005,1002'),
 ('6001', '0'),
 ('1002', '4006'),
 ('5003', '4005,4006');
20 дек 12, 11:25    [13658429]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
нормализацию придумали лохи для чайников!

Первая нормальная форма? Не, не слышал.
20 дек 12, 11:29    [13658448]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
pavel1311
Member

Откуда: Ставрополь
Сообщений: 15
iap
что кого-то озарила гениальная идея - хранить в поле список через запятую,
в то время как постоянно требуется доставать отдельные члены этого списка!
Ну да, нормализацию придумали лохи для чайников!

Структура таблицы задана нормативным документом.
iap
pavel1311, сделайте отдельную таблицу для хранения элементов списка в своих собственных записях.

Если не получится по другому, то так и придётся сделать...
Пока курю идею invm с лайком и % в разных вариациях...
iap
Да! И сразу бросается в глаза тип FLOAT. Он Вам действительно так нужен?
Рассмотрите возможность замены этого типа на DEC()

Спасибо, рассмотрю.
20 дек 12, 11:44    [13658555]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
Конец Света
Guest
Структура таблицы задана нормативным документом.

Это обойти никак нельзя? И кто такие документы составляет?
20 дек 12, 11:50    [13658606]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
pavel1311
Member

Откуда: Ставрополь
Сообщений: 15
Конец Света, ЦБ РФ
20 дек 12, 11:53    [13658630]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
Конец Света
Guest
pavel1311
Конец Света, ЦБ РФ


ОООООО!!! какие там прогеры работают. Желаю Вам терпения.
20 дек 12, 12:01    [13658714]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
pavel1311
Member

Откуда: Ставрополь
Сообщений: 15
Конец Света
pavel1311
Конец Света, ЦБ РФ


ОООООО!!! какие там прогеры работают. Желаю Вам терпения.

На самом деле, логика там есть. Это структура транспортного файла, в нём есть избыточность данных, наверное, для того, чтобы передавался один файл, а не несколько... Таблица накапливает эти транспортные файлы.
Чё-то мы удаляемся от получения результата...
20 дек 12, 12:05    [13658749]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
Конец Света
Guest
pavel1311
Конец Света
пропущено...


ОООООО!!! какие там прогеры работают. Желаю Вам терпения.

На самом деле, логика там есть. Это структура транспортного файла, в нём есть избыточность данных, наверное, для того, чтобы передавался один файл, а не несколько... Таблица накапливает эти транспортные файлы.
Чё-то мы удаляемся от получения результата...


я думаю надо тут парсить исходные данные, а потом составлять запрос на основе парсинга.

НА SQL парсить очень сложно.
20 дек 12, 12:07    [13658773]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Конец Света
НА SQL парсить очень сложно.
Не преувеличивайте.

Невозможо будет делать эффективные запросы,
ибо потребуется построчная обработка всей таблицы.
Без всяких там индексов и прочих буржуазных анахронизмов!
20 дек 12, 12:14    [13658818]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
Конец Света
Guest
iap
Конец Света
НА SQL парсить очень сложно.
Не преувеличивайте.

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


Я и говорю что сложно. это всякие фетчи писать надо и прочее.....
20 дек 12, 12:28    [13658931]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
pavel1311
Member

Откуда: Ставрополь
Сообщений: 15
Ладно, если больше нет предложений, то буду делать так:
На клиенте парсить строку с набором кодов, передаваемых в функцию, в цикле передавать в функцию каждый код и инсертить результат в конечную таблицу. По одиночному коду выборку смогу замутить, но есс-но учитывая формат V2 это будет построчно...
Еще предложения будут?
20 дек 12, 12:31    [13658958]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
Конец Света
Guest
pavel1311
Ладно, если больше нет предложений, то буду делать так:
На клиенте парсить строку с набором кодов, передаваемых в функцию, в цикле передавать в функцию каждый код и инсертить результат в конечную таблицу. По одиночному коду выборку смогу замутить, но есс-но учитывая формат V2 это будет построчно...
Еще предложения будут?


Парсинг это выход и только так. Предложений больше не будет.
20 дек 12, 12:36    [13658989]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Функция, которая делит строку на слова

+ десятки тем, если поискать.

Всё в этом мире уже было...
20 дек 12, 12:42    [13659035]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
А вот статья интересная: Массивы и Списки в SQL Server
20 дек 12, 12:44    [13659054]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом T-SQL  [new]
Конец Света
Guest
iap
Функция, которая делит строку на слова

+ десятки тем, если поискать.

Всё в этом мире уже было...


SQL код не отлаживается отладчиком и поэтому сложно на нем парсер делать!!!!
20 дек 12, 12:58    [13659168]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить