2010-04-01 39 views
4

我可以在SELECT语句中命名自定义列,并在WHERE子句中引用该列而不重复代码?在WHERE子句中使用SQL 2005中的命名自定义列?

例如;

SELECT RIGHT(REPLICATE('0', 5) + RTRIM(SOME_ID)), 5) AS DISPLAY_ID 
FROM dbo.MY_TABLE 
WHERE DISPLAY_ID LIKE '%005%' 

只有更复杂。我只想将这些代码保存在一个地方,但SQL Server 2005迫使我在WHERE子句中复制自定义SELECT。

我相信这是可能在Microsoft SQL Server 2000,但不再在2005年

感谢。

+0

什么是 “自定义列”,而所谓的其他种类? – 2010-04-02 05:34:53

+0

我怀疑这是公认的术语。我只是指在返回数据之前我执行一些操作的列。 – 2010-04-02 14:39:07

回答

6

您可以使用一个SUB SELECT或CTE功能做到这一点

SELECT * 
FROm (
      SELECT RIGHT(REPLICATE('0', 5) + RTRIM(SOME_ID), 5) AS DISPLAY_ID 
      FROM MY_TABLE 
     ) sub 
WHERE DISPLAY_ID LIKE '%005%' 

OR

;WITH Tbl AS(
     SELECT RIGHT(REPLICATE('0', 5) + RTRIM(SOME_ID), 5) AS DISPLAY_ID 
     FROM MY_TABLE 
) 
SELECT * 
FROM Tbl 
WHERE DISPLAY_ID LIKE '%005%' 

其中一个我知道你的时候可以使用列别名,也就是当你希望ORDER BY那列别名。

编辑:

多CTE块

DECLARE @MY_TABLE TABLE(
     SOME_ID INT 
) 

DECLARE @Your_TABLE TABLE(
     SOME_ID INT 
) 

;WITH Table1 AS(
     SELECT * 
     FROM @MY_TABLE 
), 
Table2 AS(
     SELECT * 
     FROM @Your_TABLE 
) 
SELECT * 
FROM Table1 t1 INNER JOIN 
     Table2 t2 ON t1.SOME_ID = t2.SOME_ID 
+0

也谢谢。 SUB SELECT工作。 – 2010-04-01 18:00:28

+0

小心嵌套你的子查询太深。这可能不仅会降低性能,而且可能会使维护非常困难。想想temp/var表,或cte查询,而不是... – 2010-04-01 18:02:17

+0

我对CTE不熟悉,在这种情况下我只需要一个SUB SELECT。尽管如此,看看这些文档,似乎CTE可能是一条可行的路。可能也有点清理我的代码。 – 2010-04-01 18:09:07

2

您可以使用子查询了一下清洁包,就像这样:

SELECT DISPLAY_ID 
FROM (SELECT RIGHT(REPLICATE('0', 5) + RTRIM(SOME_ID)), 5) AS DISPLAY_ID 
     FROM dbo.MY_TABLE) SubTable 
WHERE DISPLAY_ID LIKE '%005%' 
+0

这是一个已经很庞大的SELECT。将包裹在另一个影响表现很多? – 2010-04-01 17:54:11

+0

@Orange Kid:使用子查询将保证另一个表扫描 - 当重复时,在一个查询中执行的操作只会执行一次表扫描 - 使其性能更高。 – 2010-04-01 17:55:24

+0

@OMG小马 - Woops在甲骨文中呆得太久了,固定下来。 – 2010-04-01 17:55:26