Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 как задать условие на динамически создаваемое поле?  [new]
rtv
Member

Откуда:
Сообщений: 44
Подскажите, пожалуйста, если в выборку добавляется динамическое поле поисковым выражением CASE, то можно ли по этому полю тут же поставить условие? Если можно, то как?
У меня поле формируется (и всё равно =case, или case as), но при добавлении условия на это поле сообщается, что оно
Invalid column name


Ну это не исходник, но упрщённо что-то типа такого:
select Field1,Field2,Field3,Field4,
      CASE
		WHEN (Field1=2 and Field2=6) THEN Field4
		 ELSE Field3		
     END AS Field5
from Table1
where Field5>0

Без where отрабатывает, с where - Invalid column name 'Field5'.
29 май 19, 03:27    [21896174]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
fkthat
Member

Откуда:
Сообщений: 3039
select * from
(select Field1,Field2,Field3,Field4,
      CASE
		WHEN (Field1=2 and Field2=6) THEN Field4
		 ELSE Field3		
     END AS Field5
from Table1) t
where Field5 > 0
29 май 19, 04:40    [21896185]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Щукина Анна
Member

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

1) Вложить запрос в подзапрос. Во внешнем запросе наложить условие фильтрации по полю, вычисленному внутренним запросом.
select *
  from (тут ваш запрос с вычислением поля) as my_query
where [новое поле] = <какое-то значение>

2) Сделать всё тоже самое, но через СТЕ:
with my_query as (тут ваш запрос с вычислением поля)
Select * from my_query
where [новое поле] = <какое-то значение>
29 май 19, 04:42    [21896187]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
vikkiv
Member

Откуда: London
Сообщений: 2704
3) можно ведь при желании если есть необходимость экономии памяти на промежуточных наборах - заменить дополнительной нагрузкой на повторное вычисление всего case, типа:
select x,y,z
,case when x=3 and y>5 then x else y end a
from(values(0,1,2),(3,4,5),(3,7,8))x(x,y,z)
where case when x=3 and y>3 then x else y end >2
29 май 19, 05:03    [21896192]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
fkthat
Member

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

Да не будет там никаких промежуточных наборов ни с CTE, ни с derived table - оптимизатор все равно все развернет.
29 май 19, 05:46    [21896208]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
nullin
Member

Откуда: pullin
Сообщений: 174
select t.Field1
     , t.Field2
     , t.Field3
     , t.Field4
     
     , c.Field5
     
  from Table1 as t

 cross apply(select v.Field5 
               from (values (case
                              when t.Field1 = 2 and t.Field2 = 6 then t.Field4
                              else t.Field3
                             end)) as v(Field5)
              where v.Field5 > 0) as c
29 май 19, 10:08    [21896374]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
nullin
 cross apply(select v.Field5 
               from (values (case
                              when t.Field1 = 2 and t.Field2 = 6 then t.Field4
                              else t.Field3
                             end)) as v(Field5)
              where v.Field5 > 0) as c

Есть какой-то сакральный смысл в таком выражении мыслей в терминах SQL?

Мне кажется, это выглядит доступнее для понимания...
SELECT
  ...
FROM
  Table1 as t
  CROSS APPLY (
    SELECT
      Field5  = CASE
                  WHEN t.Field1 = 2 and t.Field2 = 6 THEN t.Field4
                  ELSE t.Field3
                END
  ) c
WHERE
  c.Field5 > 2
29 май 19, 11:34    [21896504]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
Руслан Дамирович
Есть какой-то сакральный смысл в таком выражении мыслей в терминах SQL?

Мне кажется, это выглядит доступнее для понимания...
В терминах SQL подзапросы, ИМХО, выглядят нативнее и понятнее.
29 май 19, 12:02    [21896546]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
alexeyvg
Руслан Дамирович
Есть какой-то сакральный смысл в таком выражении мыслей в терминах SQL?

Мне кажется, это выглядит доступнее для понимания...
В терминах SQL подзапросы, ИМХО, выглядят нативнее и понятнее.
То есть, я имел в виду не эти 2 варианта CROSS APPLY, а, например, это:
Щукина Анна
1) Вложить запрос в подзапрос. Во внешнем запросе наложить условие фильтрации по полю, вычисленному внутренним запросом.
select *
  from (тут ваш запрос с вычислением поля) as my_query
where [новое поле] = <какое-то значение>


2) Сделать всё тоже самое, но через СТЕ:
with my_query as (тут ваш запрос с вычислением поля)
Select * from my_query
where [новое поле] = <какое-то значение>
29 май 19, 12:03    [21896551]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
alexeyvg
В терминах SQL подзапросы, ИМХО, выглядят нативнее и понятнее.

Я имел в виду конкретно ( CROSS APPLY - SELECT FROM VALUES ) - подзапрос в подзапросе.
29 май 19, 12:15    [21896567]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Владислав Колосов
Member

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

CASE
		WHEN (Field1=2 and Field2=6) THEN Field4
		 ELSE Field3		
END AS Field5


Такое делать категорически неверно, т.к. поля не должны зависеть друг от друга.
Верным решение было бы провести нормализацию таблиц и переписать запросы.
29 май 19, 12:54    [21896634]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Владислав Колосов
Такое делать категорически неверно, т.к. поля не должны зависеть друг от друга.


интересно, где таким гениальным выводам учат.
29 май 19, 13:00    [21896646]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
rtv
Member

Откуда:
Сообщений: 44
Владислав Колосов
rtv,

CASE
		WHEN (Field1=2 and Field2=6) THEN Field4
		 ELSE Field3		
END AS Field5


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


Владислав, это же не код, это очень упрощённый пример для задания вопроса - можно ли поле, сформированное CASE, использовать в том же select, в котором оно формируется. Похоже, что нельзя.
29 май 19, 13:20    [21896677]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
rtv
Member

Откуда:
Сообщений: 44
Всем спасибо.
Всё понятно. Одним селектом не выкрутишься...
Какой вариант логичнее, сакральнее, оптимальнее я оценить не могу. Меня пока все рабочие устраивают ...
Спасибо!
29 май 19, 13:48    [21896706]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
rtv
Всё понятно. Одним селектом не выкрутишься...
Все приведенные варианты и есть "один select"
29 май 19, 13:52    [21896708]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
"можно ли поле, сформированное CASE, использовать в том же select, в котором оно формируется?"

select список_полей

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

Поэтому НЕЛЬЗЯ!
29 май 19, 14:08    [21896716]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
Wlr-l,

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

Предложение select хотя и стоит первым, но выполняется практически последним (о сортировке не забыть бы), поэтому в предложении where, которое выполняется раньше, алиасы полей не доступны.
29 май 19, 14:18    [21896725]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
rtv
Member

Откуда:
Сообщений: 44
invm
rtv
Всё понятно. Одним селектом не выкрутишься...
Все приведенные варианты и есть "один select"


invm, запрос один, а операторов select 2.

Wlr-l уже тут подытожил, внутри оператора select динамическое поле недоступно. Только если обратиться к результату этого select снаружи -"Одним селектом не выкрутишься.."
29 май 19, 14:22    [21896732]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
rtv
Member

Откуда:
Сообщений: 44
Wlr-l
Wlr-l,

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

Предложение select хотя и стоит первым, но выполняется практически последним (о сортировке не забыть бы), поэтому в предложении where, которое выполняется раньше, алиасы полей не доступны.


Wlr-l, Спасибо!
29 май 19, 14:26    [21896737]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Wlr-l
Member

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

Почему же? "Динамическое поле", т. е. алиас вполне доступен на стадии сортировки, так как она выполняется после стадии select.
29 май 19, 14:26    [21896738]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Konst_One
Member

Откуда:
Сообщений: 11522
declare @t table (Field1 int, Field2 int, Field3 int, Field4 int);

insert into @t (Field1,Field2,Field3,Field4)
values (1, 1, 1, 1),
	(2, 2, 2, 2),
	(3, 3, -3, 3),
	(2, 6, 5, 4),
	(5, 5, -5, 5);

select Field1,Field2,Field3,Field4,
      CASE
		WHEN (Field1=2 and Field2=6) THEN Field4
		 ELSE Field3		
     END AS Field5
from @t Table1
where  CASE
			WHEN (Field1=2 and Field2=6) THEN Field4
			ELSE Field3		
		END > 0
29 май 19, 14:28    [21896739]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
rtv
invm, запрос один, а операторов select 2.

Wlr-l уже тут подытожил, внутри оператора select динамическое поле недоступно. Только если обратиться к результату этого select снаружи -"Одним селектом не выкрутишься.."


ой, да ладно. один select

select 
	 t.Field1, t.Field2, t.Field3, t.Field4,
	 v.field5      
from Table1 as t
cross apply(values (iif(t.field1 = 2 and t.field2 = 6, t.field4, t.field3))) as v(field5)
where v.Field5 > 0
29 май 19, 14:29    [21896740]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
Очень много советов "как это можно сделать", но нужно объяснить ТС почему конструкция

select field as a
from table
where a=value

не работает.
29 май 19, 14:38    [21896746]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Wlr-l
Очень много советов "как это можно сделать", но нужно объяснить ТС почему конструкция

select field as a
from table
where a=value

не работает.


так вы ж уже про алиас и порядок обработки написали
можно и доку показать https://docs.microsoft.com/ru-ru/sql/t-sql/queries/select-transact-sql?view=sql-server-2017#logical-processing-order-of-the-select-statement
там ясно написано
Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses
29 май 19, 14:40    [21896748]     Ответить | Цитировать Сообщить модератору
 Re: как задать условие на динамически создаваемое поле?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7780
Посетитель
Владислав Колосов
Такое делать категорически неверно, т.к. поля не должны зависеть друг от друга.


интересно, где таким гениальным выводам учат.


Ваше предложение?
29 май 19, 16:15    [21896971]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить