我的查询如下:
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用于另一个数据库。
答案 1 :(得分: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
答案 2 :(得分: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;
但是,这可能会使其更容易阅读或维护。