在SQL中将列名定义为另一个名称?

时间:2015-05-24 15:19:09

标签: mysql sql pdo

我的查询如下:

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

在此示例中,只需要更改一行而不是四行。它更容易阅读和维护。

3 个答案:

答案 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;

但是,这可能会使其更容易阅读或维护。