powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как задать условие на динамически создаваемое поле?
25 сообщений из 44, страница 1 из 2
как задать условие на динамически создаваемое поле?
    #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
как задать условие на динамически создаваемое поле?
    #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
как задать условие на динамически создаваемое поле?
    #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
как задать условие на динамически создаваемое поле?
    #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
как задать условие на динамически создаваемое поле?
    #39819580
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv,

Да не будет там никаких промежуточных наборов ни с CTE, ни с derived table - оптимизатор все равно все развернет.
...
Рейтинг: 0 / 0
как задать условие на динамически создаваемое поле?
    #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
как задать условие на динамически создаваемое поле?
    #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
как задать условие на динамически создаваемое поле?
    #39819732
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичЕсть какой-то сакральный смысл в таком выражении мыслей в терминах SQL?

Мне кажется, это выглядит доступнее для понимания...В терминах SQL подзапросы, ИМХО, выглядят нативнее и понятнее.
...
Рейтинг: 0 / 0
как задать условие на динамически создаваемое поле?
    #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
как задать условие на динамически создаваемое поле?
    #39819747
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgВ терминах SQL подзапросы, ИМХО, выглядят нативнее и понятнее.
Я имел в виду конкретно ( CROSS APPLY - SELECT FROM VALUES ) - подзапрос в подзапросе.
...
Рейтинг: 0 / 0
как задать условие на динамически создаваемое поле?
    #39819784
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rtv,

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



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

интересно, где таким гениальным выводам учат.
...
Рейтинг: 0 / 0
как задать условие на динамически создаваемое поле?
    #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
как задать условие на динамически создаваемое поле?
    #39819824
rtv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rtv
Гость
Всем спасибо.
Всё понятно. Одним селектом не выкрутишься...
Какой вариант логичнее, сакральнее, оптимальнее я оценить не могу. Меня пока все рабочие устраивают ...
Спасибо!
...
Рейтинг: 0 / 0
как задать условие на динамически создаваемое поле?
    #39819826
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rtvВсё понятно. Одним селектом не выкрутишься...Все приведенные варианты и есть "один select"
...
Рейтинг: 0 / 0
как задать условие на динамически создаваемое поле?
    #39819832
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
" можно ли поле, сформированное CASE, использовать в том же select, в котором оно формируется? "

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

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

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

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

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

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

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

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

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

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

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

select field as a
from table
where a=value

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

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

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


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