2012-03-09 78 views
1

在SQL中,您可以使用别名WHERE表达式来简化查询吗?别名WHERE子句来简化您的查询

比如我有

SELECT * FROM T 
WHERE 
(x*y<15 AND x*z > 20) 
OR 
(x*y>20 AND x*z < 100) 

有没有一种方法来表示X * Y为a和x * Z为B,这样我可以重写我的查询作为

SELECT * FROM T 
WHERE 
(a<15 AND b>20) 
OR 
(a>20 AND b<100) 

我在SQL服务器

+0

类似的问题:http://stackoverflow.com/questions/260399/using-an- alias-column-in-the-where-clause-in-ms-sql-2000 – diaho 2012-03-09 02:21:03

+0

请不要在SQL前加标题。那是什么标签 – 2012-03-09 03:17:59

回答

4

您可以尝试这种方式。

SELECT * 
FROM 
(
    SELECT x, y, z, (x*y) xy, (x*z) xz 
    FROM T 
) R 
WHERE (xy < 15 AND xz > 20) OR (xy > 20 AND xz < 100) 
+0

这是否会工作? – 2012-03-09 02:28:17

+0

为什么不..你试过了吗? – 2012-03-09 02:33:08

+0

啊。错过了外部选择。你是对的。 – 2012-03-09 02:45:10

2

你可以,如果你使用SQL Server 2005或更高版本使用Common Table Expression

DECLARE @myTable TABLE([x] INT, [y] INT, [z] INT) 
INSERT INTO @myTable VALUES(2, 1, 1) 
INSERT INTO @myTable VALUES(3, 2, 2) 
INSERT INTO @myTable VALUES(4, 2, 3) 
INSERT INTO @myTable VALUES(5, 2, 5) 
INSERT INTO @myTable VALUES(6, 4, 5) 

;WITH CTE ([x], [y], [z], [xy], [xz]) AS 
(
    SELECT x, y, z, x*y, x*z FROM @myTable 
) 
SELECT x, y, z 
FROM CTE 
WHERE 
    (xy < 15 AND xz > 20) 
    OR (xy > 20 AND xz < 100) 
1
WITH T1 
    AS 
    (
     SELECT T.*, 
       x * y AS a, 
       x * z AS b 
     FROM T 
    ) 
SELECT * FROM T1 
WHERE 
(a<15 AND b>20) 
OR 
(a>20 AND b<100);