powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
19 сообщений из 19, страница 1 из 1
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037410
kost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня такой запрос типа:

SELECT Pa.ObjectPathID, Pa.ObjectPath,
Max(CASE r.LowNodePathID WHEN 25 THEN c.data ELSE NULL END) AS Name,
...
FROM ...
WHERE ...

Хочу написать в WHERE Name='Вилка'
На что он ругается, грит нет такого столбца Name. Да столбца то нет, но алиас то столбца есть. Что алиасы нельзя в условия пихать? Как же тогда написать простейший запрос типа:
SELECT a.quantity*b.price AS sum
FROM a, b
WHERE a.id=b.id AND sum>10
Он тоже не будет работать?
Конечно можно написать WHERE a.quantity*b.price>10.
Но в моем случае аналогично не сделаешь, потому что грит что нельзя агрегируемые функции в WHERE пихать.

Что делать? Как обмануть SQL?
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037412
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Probuy HAVING Name='...'
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037417
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подзапрос скорее всего....
весь запрос на бочку!...
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037425
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
алиас колонки можно использовать только в order by
в условиях используются не алиасы колонок, а названия столбцов таблицы с алиасами таблиц, так что всё логично, хотя и неудобно
отправляйте во временную таблицу или пишите два раза выражение
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037426
Фотография Белов Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Guest
having можно использовать, только когда используется group by
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037428
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Белов Владимир

Nu tak vivesti v SELECTe pervichniy kluch i sdelat` po nemu
GROUP BY - v chom problema?
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037429
Фотография Белов Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первое что приходит в голову
сначала во временную таблицу, а затем
из неё по условию where

может и корявое решение
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037438
Erika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, будет работать так (в простейшем запросе):
Код: plaintext
1.
2.
SELECT a.quantity*b.price AS sum 
FROM a, b 
WHERE a.id=b.id AND (a.quantity*b.price) > 10  


или, в Вашем случае (не проверяла):
Код: plaintext
1.
2.
3.
4.
SELECT Pa.ObjectPathID, Pa.ObjectPath, 
Max(CASE r.LowNodePathID WHEN  25  THEN c.data ELSE NULL END) AS Name, 
... 
FROM ... 
WHERE (CASE r.LowNodePathID WHEN  25  THEN c.data ELSE NULL END) ='Вилка' 

т.е. в условие запроса надо включать не псевдоним, а само вычисляемое выражение.
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037448
kost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Erika, вы забыли что у меня MAX(), а WHERE MAX() нельзя. Читайте исходное сообщение.

Для всех остальных: если обратили внимание то это перекрестный запрос (поэтому там есть Group BY), да еще к тому же он у меня динамически формируется. Попробовал использовать Having, но все равно ругается:Invalid column name 'Name'.

Привожу полный текс запроса, уже вместе с Having
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT Pa.ObjectPathID, Pa.ObjectPath,
Max(CASE r.LowNodePathID WHEN  25  THEN c.data ELSE NULL END) AS Name,
Max(CASE r.LowNodePathID WHEN  26  THEN c.data ELSE NULL END) AS Obozn,
Max(CASE r.LowNodePathID WHEN  99  THEN n.dataLow ELSE NULL END) AS kod_id,
Max(CASE r.LowNodePathID WHEN  52  THEN i.dataLow ELSE NULL END) AS letter
FROM Paths Pa INNER JOIN Relations r ON Pa.ObjectPathID=r.HighNodePathID
INNER JOIN RelationSpecification rs ON r.RelationID=rs.RelationID
INNER JOIN Specification s ON rs.SpecificationID=s.SpecificationID
LEFT JOIN CharData c ON s.SpecificationID=c.SpecificationID
LEFT JOIN IntData i ON s.SpecificationID=i.SpecificationID
LEFT JOIN NumericData n ON s.SpecificationID=n.SpecificationID
WHERE Pa.ObjectSourcePathID= 3 
AND LEN(Pa.ObjectPath)=LEN('002001')+ 3 
AND Pa.ObjectPath LIKE '002001'+'___'
GROUP BY Pa.ObjectPathID, Pa.ObjectPath
HAVING Name='Сборочные единицы'
ORDER BY ASCII(SUBSTRING(Pa.ObjectPath, LEN(Pa.ObjectPath)- 2 ,  1 ))* 1000000 +ASCII(SUBSTRING(Pa.ObjectPath, LEN(Pa.ObjectPath)- 1 ,  1 ))* 1000 +ASCII(SUBSTRING(Pa.ObjectPath, LEN(Pa.ObjectPath),  1 ))
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037450
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 kost

А почему нельзя просто написать
where c.data = 'Вилка' ?
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037455
kost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
c.data='Вилка' нельзя написать потому что мне нужно что бы только столбец Name был Вилка, а не все столбцы, которые формируются из таблицы chardata. Если вы заметили там еще Obozn есть. А так как запрос динамический (саму динамику я опустил), то столбцов из CharData может быть куча. И тогда получиться что во всех столбцах только Вилка останется.
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037461
Erika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, действительно не заметила, что запрос должен содержать Group By

>>вы забыли что у меня MAX(), а WHERE MAX() нельзя
Зато Having Max() можно.
Код: plaintext
Having Max(CASE r.LowNodePathID WHEN  25  THEN c.data ELSE NULL END) = 'Сборочные единицы'

должно пройти.

>>если обратили внимание то это перекрестный запрос (поэтому там есть Group BY)
Group By - не потому, что перекрестный, а потому, что содержит функции агрегирования для строк(групп).

BOL:
The GROUP BY clause is used to produce aggregate values for each row in the result set. When used without a GROUP BY clause, aggregate functions report only one aggregate value for a SELECT statement.
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037463
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 kost

Ничего не понял из Вашего объяснения, а вот глядя на запрос вижу, что конструкции

where Max(CASE r.LowNodePathID WHEN 25 THEN c.data ELSE NULL END) = 'Вилка'

и

where c.data = 'Вилка'

идентичны.
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037476
kost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Gennady

Нет не идентичны, смотрите весь запрос. Еще раз объясню:
в данном запросе из таблицы chardata получаются два столбца с алиасами Name и Obozn и если я поставлю c.data="Вилка", то оба этих столбца будут отфильрованы по этому значению. А мне нужно, чтобы только Name.

2 Erika
Действительно, такая конструкция работает. Если больше никто ничего не посоветует, то буду ее использовать. Спасибо
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037479
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 kost

Нда, действительно, недосмотрел.
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037508
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно запихнуть вычисляемое выражение во view а условие WHERE налагать потом.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE VIEW blablabla AS
SELECT Pa.ObjectPathID, Pa.ObjectPath,
CASE r.LowNodePathID WHEN  25  THEN c.data ELSE NULL END AS Name,
CASE r.LowNodePathID WHEN  26  THEN c.data ELSE NULL END AS Obozn,
CASE r.LowNodePathID WHEN  99  THEN n.dataLow ELSE NULL END AS kod_id,
CASE r.LowNodePathID WHEN  52  THEN i.dataLow ELSE NULL END AS letter
FROM Paths Pa INNER JOIN Relations r ON Pa.ObjectPathID=r.HighNodePathID
INNER JOIN RelationSpecification rs ON r.RelationID=rs.RelationID
INNER JOIN Specification s ON rs.SpecificationID=s.SpecificationID
LEFT JOIN CharData c ON s.SpecificationID=c.SpecificationID
LEFT JOIN IntData i ON s.SpecificationID=i.SpecificationID
LEFT JOIN NumericData n ON s.SpecificationID=n.SpecificationID


Также можно использовать подзапрос.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT Pa.ObjectPathID, Pa.ObjectPath,
blablabla.Name,blablabla.Obozn,blablabla.kod_id,blablabla.letter
FROM Paths Pa INNER JOIN 
(
select
CASE r.LowNodePathID WHEN  25  THEN c.data ELSE NULL END AS Name,
CASE r.LowNodePathID WHEN  26  THEN c.data ELSE NULL END AS Obozn,
CASE r.LowNodePathID WHEN  99  THEN n.dataLow ELSE NULL END AS kod_id,
CASE r.LowNodePathID WHEN  52  THEN i.dataLow ELSE NULL END AS letter
from Relations r ON Pa.ObjectPathID=r.HighNodePathID
INNER JOIN RelationSpecification rs ON r.RelationID=rs.RelationID
INNER JOIN Specification s ON rs.SpecificationID=s.SpecificationID
LEFT JOIN CharData c ON s.SpecificationID=c.SpecificationID
LEFT JOIN IntData i ON s.SpecificationID=i.SpecificationID
LEFT JOIN NumericData n ON s.SpecificationID=n.SpecificationID
) as blablabla
WHERE Pa.ObjectSourcePathID= 3 
AND LEN(Pa.ObjectPath)=LEN('002001')+ 3 
AND Pa.ObjectPath LIKE '002001'+'___'
and blablabla.Name='Сборочные единицы'


P.S. Писал на коленке, так что сильно не ругайте. :)
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037510
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И сразу нашел ошибку, второй код д.б. такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT Pa.ObjectPathID, Pa.ObjectPath,
blablabla.Name,blablabla.Obozn,blablabla.kod_id,blablabla.letter
FROM Paths Pa INNER JOIN 
(
select
r.HighNodePathID,
CASE r.LowNodePathID WHEN  25  THEN c.data ELSE NULL END AS Name,
CASE r.LowNodePathID WHEN  26  THEN c.data ELSE NULL END AS Obozn,
CASE r.LowNodePathID WHEN  99  THEN n.dataLow ELSE NULL END AS kod_id,
CASE r.LowNodePathID WHEN  52  THEN i.dataLow ELSE NULL END AS letter
from Relations r
INNER JOIN RelationSpecification rs ON r.RelationID=rs.RelationID
INNER JOIN Specification s ON rs.SpecificationID=s.SpecificationID
LEFT JOIN CharData c ON s.SpecificationID=c.SpecificationID
LEFT JOIN IntData i ON s.SpecificationID=i.SpecificationID
LEFT JOIN NumericData n ON s.SpecificationID=n.SpecificationID
) as blablabla ON Pa.ObjectPathID=blablabla.HighNodePathID
WHERE Pa.ObjectSourcePathID= 3 
AND LEN(Pa.ObjectPath)=LEN('002001')+ 3 
AND Pa.ObjectPath LIKE '002001'+'___'
and blablabla.Name='Сборочные единицы'
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037761
kost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 VVG

На мой взгляд предложенные тобой методы будут работать медленнее, чем один запрос (обязательно проверю).
А поскольку данный запрос формируется у меня динамически на основании данных введенных пользователем (если кто-то уже догадался то это запрос на поиск объектов в базе по условиям пользователя), то вариант с view вообще по-моему отпадает. А вот вариант с подзапросом конечно остается, но больно уж эти подзапросы медленно работают.

Все равно спасибо за предложение. Будет писча для проверки скорости работы при различных вариантах, поскольку быстрота поиска для пользователя - одно из главных его желаний.
...
Рейтинг: 0 / 0
Ребяты, а как запихать вычисляемый столбец в запросе в условие Where?
    #32037892
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверку
Код: plaintext
and blablabla.Name='Сборочные единицы'

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


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