Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как задать условие на динамически создаваемое поле? / 25 сообщений из 44, страница 1 из 2
29.05.2019, 03:27
    #39819565
rtv
rtv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Подскажите, пожалуйста, если в выборку добавляется динамическое поле поисковым выражением CASE, то можно ли по этому полю тут же поставить условие? Если можно, то как?
У меня поле формируется (и всё равно =case, или case as) , но при добавлении условия на это поле сообщается, что оно
Invalid column name


Ну это не исходник, но упрщённо что-то типа такого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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'.
...
Рейтинг: 0 / 0
29.05.2019, 04:40
    #39819569
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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
...
Рейтинг: 0 / 0
29.05.2019, 04:42
    #39819570
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
rtv,

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


2) Сделать всё тоже самое, но через СТЕ:
Код: sql
1.
2.
3.
with my_query as (тут ваш запрос с вычислением поля)
Select * from my_query
where [новое поле] = <какое-то значение>
...
Рейтинг: 0 / 0
29.05.2019, 05:03
    #39819574
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
3) можно ведь при желании если есть необходимость экономии памяти на промежуточных наборах - заменить дополнительной нагрузкой на повторное вычисление всего case, типа:
Код: sql
1.
2.
3.
4.
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
...
Рейтинг: 0 / 0
29.05.2019, 05:46
    #39819580
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
vikkiv,

Да не будет там никаких промежуточных наборов ни с CTE, ни с derived table - оптимизатор все равно все развернет.
...
Рейтинг: 0 / 0
29.05.2019, 10:08
    #39819648
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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
...
Рейтинг: 0 / 0
29.05.2019, 11:34
    #39819711
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
nullin
Код: sql
1.
2.
3.
4.
5.
6.
 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?

Мне кажется, это выглядит доступнее для понимания...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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
...
Рейтинг: 0 / 0
29.05.2019, 12:02
    #39819732
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Руслан ДамировичЕсть какой-то сакральный смысл в таком выражении мыслей в терминах SQL?

Мне кажется, это выглядит доступнее для понимания...В терминах SQL подзапросы, ИМХО, выглядят нативнее и понятнее.
...
Рейтинг: 0 / 0
29.05.2019, 12:03
    #39819734
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
alexeyvgРуслан ДамировичЕсть какой-то сакральный смысл в таком выражении мыслей в терминах SQL?

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



2) Сделать всё тоже самое, но через СТЕ:
Код: sql
1.
2.
3.
with my_query as (тут ваш запрос с вычислением поля)
Select * from my_query
where [новое поле] = <какое-то значение>
...
Рейтинг: 0 / 0
29.05.2019, 12:15
    #39819747
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
alexeyvgВ терминах SQL подзапросы, ИМХО, выглядят нативнее и понятнее.
Я имел в виду конкретно ( CROSS APPLY - SELECT FROM VALUES ) - подзапрос в подзапросе.
...
Рейтинг: 0 / 0
29.05.2019, 12:54
    #39819784
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
rtv,

Код: sql
1.
2.
3.
4.
CASE
		WHEN (Field1=2 and Field2=6) THEN Field4
		 ELSE Field3		
END AS Field5



Такое делать категорически неверно, т.к. поля не должны зависеть друг от друга.
Верным решение было бы провести нормализацию таблиц и переписать запросы.
...
Рейтинг: 0 / 0
29.05.2019, 13:00
    #39819793
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Владислав КолосовТакое делать категорически неверно, т.к. поля не должны зависеть друг от друга.

интересно, где таким гениальным выводам учат.
...
Рейтинг: 0 / 0
29.05.2019, 13:20
    #39819809
rtv
rtv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Владислав Колосовrtv,

Код: sql
1.
2.
3.
4.
CASE
		WHEN (Field1=2 and Field2=6) THEN Field4
		 ELSE Field3		
END AS Field5



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

Владислав, это же не код, это очень упрощённый пример для задания вопроса - можно ли поле, сформированное CASE, использовать в том же select, в котором оно формируется. Похоже, что нельзя.
...
Рейтинг: 0 / 0
29.05.2019, 13:48
    #39819824
rtv
rtv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Всем спасибо.
Всё понятно. Одним селектом не выкрутишься...
Какой вариант логичнее, сакральнее, оптимальнее я оценить не могу. Меня пока все рабочие устраивают ...
Спасибо!
...
Рейтинг: 0 / 0
29.05.2019, 13:52
    #39819826
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
rtvВсё понятно. Одним селектом не выкрутишься...Все приведенные варианты и есть "один select"
...
Рейтинг: 0 / 0
29.05.2019, 14:08
    #39819832
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
" можно ли поле, сформированное CASE, использовать в том же select, в котором оно формируется? "

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

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

Поэтому НЕЛЬЗЯ!
...
Рейтинг: 0 / 0
29.05.2019, 14:18
    #39819836
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Wlr-l,

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

Предложение select хотя и стоит первым, но выполняется практически последним (о сортировке не забыть бы), поэтому в предложении where, которое выполняется раньше, алиасы полей не доступны.
...
Рейтинг: 0 / 0
29.05.2019, 14:22
    #39819841
rtv
rtv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
invmrtvВсё понятно. Одним селектом не выкрутишься...Все приведенные варианты и есть "один select"

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

Wlr-l уже тут подытожил, внутри оператора select динамическое поле недоступно. Только если обратиться к результату этого select снаружи -"Одним селектом не выкрутишься.."
...
Рейтинг: 0 / 0
29.05.2019, 14:26
    #39819844
rtv
rtv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Wlr-lWlr-l,

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

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

Wlr-l, Спасибо!
...
Рейтинг: 0 / 0
29.05.2019, 14:26
    #39819845
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
rtv,

Почему же? "Динамическое поле", т. е. алиас вполне доступен на стадии сортировки, так как она выполняется после стадии select.
...
Рейтинг: 0 / 0
29.05.2019, 14:28
    #39819846
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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
...
Рейтинг: 0 / 0
29.05.2019, 14:29
    #39819847
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
rtvinvm, запрос один, а операторов select 2.

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

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

Код: sql
1.
2.
3.
4.
5.
6.
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
...
Рейтинг: 0 / 0
29.05.2019, 14:38
    #39819850
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
Очень много советов "как это можно сделать", но нужно объяснить ТС почему конструкция

select field as a
from table
where a=value

не работает.
...
Рейтинг: 0 / 0
29.05.2019, 14:40
    #39819852
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
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
...
Рейтинг: 0 / 0
29.05.2019, 16:15
    #39819937
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как задать условие на динамически создаваемое поле?
ПосетительВладислав КолосовТакое делать категорически неверно, т.к. поля не должны зависеть друг от друга.

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

Ваше предложение?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как задать условие на динамически создаваемое поле? / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]