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

Откуда:
Сообщений: 29
Здравствуйте!
Подскажите, пожалуйста, возможно ли такое без курсора?
Исходная таблица

col1 col2 col3
-----------------------------------
1 | 1 | col1 = 1
1 | 2 | col1 = 1
2 | 1 | col1 = 2 and col2 = 1
2 | 2 | col1 = 2 and col2 = 1
3 | 1 | NULL
-----------------------------------
Хотелось бы увидеть

col1 col2
--------------------
1 | 1
1 | 2
2 | 1
3 | 1
--------------------
Спасибо.
28 сен 11, 17:37    [11350253]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Glory
Member

Откуда:
Сообщений: 104751
Это какая то шифровка ? Или формула лекарства от спида ?
28 сен 11, 17:39    [11350265]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Kreb_1, возможно.
28 сен 11, 17:48    [11350335]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Kreb_1
Member

Откуда:
Сообщений: 29
Glory,

Прошу прощения. Есть таблица
create table t(col1 int, col2 int, col3 nvarchar(max))
insert into t(col1,col2,col3) values(1,1, 'col1 = 1')
insert into t(col1,col2,col3) values(1,2, 'col1 = 1')
insert into t(col1,col2,col3) values(2,1, 'col1 = 2 and col2 = 1')
insert into t(col1,col2,col3) values(2,2, 'col1 = 2 and col2 = 1')
insert into t(col1,col2,col3) values(3,1, NULL)


Хотелось бы в одной конструкции T-SQL результирующий набор, указанный выше.
А по сути это извраты проектирования :)
28 сен 11, 17:52    [11350373]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Kreb_1
Member

Откуда:
Сообщений: 29
Mnior,

Пожалуйста, подскажите куда копать. Через курсоры не хотелось бы, а в синтаксисе не нашел, как такое можно выполнить.
28 сен 11, 17:54    [11350390]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kreb_1
Хотелось бы в одной конструкции T-SQL результирующий набор, указанный выше.
А по сути это извраты проектирования :)

Вы хотите для каждой записи проверяит условие, которое записано в поле col3 ?
28 сен 11, 17:56    [11350407]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Kreb_1
Member

Откуда:
Сообщений: 29
Glory,

да
28 сен 11, 17:57    [11350414]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kreb_1
Glory,

да

Здравствуй, курсор !
Или CLR
28 сен 11, 17:58    [11350430]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Kreb_1
Member

Откуда:
Сообщений: 29
Kreb_1,

Дело в том, что полей гораздо больше и логическая конструкция в col3 может быть сложной и по любому полю (в данном случае col1, col2) через apply не получается
28 сен 11, 17:59    [11350433]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Kreb_1
Member

Откуда:
Сообщений: 29
Glory,

Спасибо
28 сен 11, 17:59    [11350437]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Kreb_1, ответ зависит от сложности допустимых в col3 выражений, т.е. от того, получится ли у вас написать функцию для парсинга и оценки
28 сен 11, 18:00    [11350444]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Kreb_1
в синтаксисе не нашел, как такое можно выполнить.
select col1,col2
from t
where col3 is null or
(
	(col3 not like '%col1%' or col3 like '%col1 = '+CONVERT(nvarchar, col1)+'%')
	and (col3 not like '%col2%' or col3 like '%col2 = '+CONVERT(nvarchar, col2)+'%')
)
28 сен 11, 18:00    [11350448]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Kreb_1
Kreb_1,

Дело в том, что полей гораздо больше и логическая конструкция в col3 может быть сложной и по любому полю (в данном случае col1, col2) через apply не получается
Тогда да, CLR или курсор
28 сен 11, 18:01    [11350467]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Kreb_1
А по сути это извраты проектирования
А нельзя поправить? Надо же такое придумать :-)
28 сен 11, 18:03    [11350478]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Kreb_1
Member

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

Спасибо работает, но естественно плохой план и конструкцию запроса не хотелось бы привязывать к полям перечисленным в фильтре col3.
28 сен 11, 18:06    [11350498]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
iljy
Member

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

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

а план у вас может быть только полным сканированием, какие варианты-то? Чтобы проверить строку на условие - надо его прочитать, а оно в самой строке. Не, это хрень какая-то. Откуда это чудо дизайнерской мысли вообще взялось?
28 сен 11, 18:10    [11350524]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Kreb_1
Member

Откуда:
Сообщений: 29
iljy,

Всем большое спасибо.
28 сен 11, 18:41    [11350718]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Kreb_1
естественно плохой план
Естественно.

Kreb_1
и конструкцию запроса не хотелось бы привязывать к полям перечисленным в фильтре col3.
Вообще такую задачу решают генеря, например, вьюхи или процедуры по изменению таблицы с формулами.

Иначе парсинг будет сложным и медленным.
28 сен 11, 18:58    [11350820]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
iljy
Member

Откуда:
Сообщений: 8711
Kreb_1,

у вас задача-то какая? Проверить, соответствуют ли значения записанной в строке формуле с ограничениями? Так надо считать это заранее и в строку писать сразу результат, тогда и поиск по нему делать можно будет. Как вариант - парсер на CLR, на его основе функцию, на ее основе вычисляемое поле, по нему индекс. Но меня не покидает ощущение езды на тракторе по канату.
28 сен 11, 19:12    [11350876]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Чего-то сегодня меня на извращения тянет
use tempdb
go
create table dbo.t(i uniqueidentifier primary key, col1 int, col2 int, col3 nvarchar(max), matched bit not null default 0);
go
create view dbo.v
as
select i, col1, col2, col3, matched from dbo.t;
go
create trigger dbo.tr_v
on dbo.v
instead of insert, update
as
begin
 if @@rowcount = 0
  return;
 
 set nocount on;
 
 declare @s nvarchar(max) = '';

 select
  @s = @s +
   'with src as ' + 
   '(select ' +
      quotename(cast(i.i as varchar(36)), '''') + ' as i, ' + 
      cast(i.col1 as varchar(10)) + ' as col1, ' + 
      cast(i.col2 as varchar(10)) + ' as col2, ' + 
      isnull(quotename(i.col3, ''''), 'null') + ' as col3) ' +
   'merge into dbo.t ' +
   'using ' +
   '(select i, col1, col2, col3, case when ' + isnull(i.col3, '1 = 1') + ' then 1 else 0 end as matched from src) as s on s.i = t.i ' +
   'when matched then ' +
   'update ' +
   'set ' +
   'col1 = s.col1, ' +
   'col2 = s.col2, ' +
   'col3 = s.col3, ' +
   'matched = s.matched ' +
   'when not matched by target then ' +
   'insert ' +
   '(i, col1, col2, col3, matched) ' +
   'values ' +
   '(s.i, s.col1, s.col2, s.col3, matched);'
 from
  inserted i;
    
 exec(@s);
end;
go
insert into v(i, col1,col2,col3)
values
 (newid(), 1,1, 'col1 = 1'),
 (newid(), 1,2, 'col1 = 1'),
 (newid(), 2,1, 'col1 = 2 and col2 = 1'),
 (newid(), 2,2, 'col1 = 2 and col2 = 1'),
 (newid(), 3,1, NULL);
go
select * from dbo.v;
go
drop view dbo.v;
drop table dbo.t;
go
28 сен 11, 21:20    [11351227]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
SignOff
Member

Откуда: Stockholm
Сообщений: 424
invm,

А если в табличке будет 1 миллион строчек, то ваш запросик нормально отработает ?
29 сен 11, 09:47    [11352663]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Kreb_1, А что даёт этот запрос?:
SELECT DISTINCT col3 FROM t
Если вариантов немного, тогда CASE обыкновенный.

Было на форуме пару раз такое, да и встречал в реале, но в итоге везде свелось именно к этому. Вот у вас всего два варианта + NULL.

PS: А всё из-за криворукого разработчика, у которого крыша съехала на "универсализме".
29 сен 11, 09:57    [11352707]     Ответить | Цитировать Сообщить модератору
 Re: фильтрация по полю в select  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
SignOff
invm,

А если в табличке будет 1 миллион строчек, то ваш запросик нормально отработает ?

Посмотреть на смайл в конце первого предложения не?
И причем тут размер таблицы? Какой запросик из? Критерий "нормальности" каков?
Или имелось в виду, что если операция затронет миллион строк, то можно превысить batch size? Ну да, можно. Тогда надо будет увеличить Network Packet Size

А вообще, если количество и объем вставок/модификаций для этой таблицы небольшой, то решение вполне сгодится в качестве костыльного, до окончания переработки архитектуры.
29 сен 11, 10:43    [11352995]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить