2015-05-24 4 views
0

У меня есть запрос, как показано ниже:Определить имя столбца в качестве другого имени в SQL?

SELECT value 
    FROM table 
    WHERE ((col1+col2+col3)/col4) > 4 
    AND ((col1+col2+col3)/col4) < 5 
UNION ALL 
SELECT value 
    FROM table 
    WHERE ((col1+col2+col3)/col4) > 3 
    AND ((col1+col2+col3)/col4) < 4 

я хотел бы определить ((col1+col2+col3)/col4) как некоторые названия, так что если я хочу изменить условия запроса SQL (например, может быть, я хотел бы, чтобы это было. ((col1+col2-col3)*col4)), мне не нужно проходить весь текст запроса SQL и изменять каждую строку.

DEFINE ((col1+col2+col3)/col4) AS var 
SELECT value 
    FROM table 
    WHERE var > 4 
    AND var < 5 
UNION ALL 
SELECT value 
    FROM table 
    WHERE var > 3 
    AND var < 4 

В этом примере вместо четырех в одной строке необходимо изменить только одну строку. Его легче читать и поддерживать.

+0

Какую базу вы используете? Пожалуйста, отметьте вопрос соответствующим образом. –

ответ

2

Вы можете сделать union all перед определением:

SELECT ((col1+col2+col3)/col4) as value 
FROM ((SELECT col1, col2, col3, col4 
     FROM table1 
    ) UNION ALL 
     (SELECT col1, col2, col3, col4 
     FROM table2 
    ) 
    ) t 
HAVING value > 4 and value < 5 

Это использование пункта having специфичен для MySQL. Вам понадобится другой подзапрос или CTE для другой базы данных.

0

В MySQL:

«Пользовательские переменные предназначены для значений данных они не могут быть использованы непосредственно в операторе SQL в качестве идентификатора или как часть идентификатора, например, в контекстах, где. имя таблицы или базы данных ожидается, или как зарезервированное слово, такие как SELECT, Это верно, даже если переменная цитирует [...]»

Ссылка:. https://dev.mysql.com/doc/refman/5.0/en/user-variables.html

Тем не менее, вы можете построить и выполнить запрос следующим образом:

SET @var=((col1+col2+col3)/col4); 
SET @s=CONCAT("SELECT value FROM table WHERE ", @var," > 4 AND ", @var, 
" < 5 UNION ALL SELECT value FROM table WHERE ", @var," > 3 AND ", @var, 
" < 4"); 
PREPARE stmt FROM @s; 
EXECUTE stmt; 

Однако, это, вероятно, поражения цели, что делает его легче читать и поддерживать.

2
SELECT tt.value FROM 
    (SELECT ((t.col1+t.col2+t.col3)/t.col4) as value 
     FROM ((SELECT col1, col2, col3, col4 
       FROM #Temp 
      ) UNION ALL 
      (SELECT col1, col2, col3, col4 
       FROM #Temp 
      ) 

      ) t)tt 
GROUP BY tt.value 
HAVING tt.value > 4 and tt.value < 5 
Смежные вопросы