2012-03-09 72 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);