在SQL 2005中如何在WHERE子句中使用命名的自定义列?

7

我能否在SELECT语句中命名自定义列,并在WHERE子句中引用它而不重复代码?

例如:

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年已不再支持。

谢谢。


“自定义列”是什么,另一种叫什么? - John Saunders
我怀疑那是否是被接受的术语。我只是指在返回数据之前执行某些操作的列。 - Orange Kid
2个回答

10
您可以使用子查询或CTE函数来实现此操作。
SELECT  *
FROm    (
            SELECT RIGHT(REPLICATE('0', 5) + RTRIM(SOME_ID), 5) AS DISPLAY_ID 
            FROM MY_TABLE 
        )   sub
WHERE   DISPLAY_ID LIKE '%005%' 

或者

;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%' 

我知道使用列别名的其中一个时机是当你想要按照该列别名进行排序时。

编辑:

多个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

小心嵌套子查询嵌套太深。这不仅可能导致性能下降,而且可能使维护变得非常困难。考虑使用临时表、变量表或公用表表达式(CTE)查询。 - Adriaan Stander
我不熟悉CTE,而且在这种情况下我只需要一个SUB SELECT。不过,看了文档后,似乎CTE可能是更好的选择。这也可能会让我的代码更加简洁。 - Orange Kid
好的,CTE(公共表达式)更加令人愉悦。感谢您向我介绍它们。 - Orange Kid
您知道您可以同时使用多个CTE选择。如果您想了解更多信息,而且找不到文档,我很乐意帮助 X-) - Adriaan Stander
你的意思是可以有两个CTE块,并在下面的SELECT语句中同时使用它们吗? - Orange Kid
是的,没错,你可以有两个CTE块。 - Adriaan Stander

3
你可以使用一个更简洁的子查询来包装它,像这样:

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%'

这是一个已经非常庞大的SELECT语句。将其包装在另一个语句中会对性能产生多大影响? - Orange Kid
使用子查询将保证另一个表扫描——尽管有重复,但在一个查询中执行只会执行一次表扫描,从而使其更有效率。 - OMG Ponies
嘿,小马们,你们有没有注意到,今天你们的照片看起来和往常一样 >:-) - Adriaan Stander
@Nick Craver,你的答案没有使用子查询。子查询是一个SELECT查询,返回单个值,并嵌套在SELECT、INSERT、UPDATE或DELETE语句中,或嵌套在另一个子查询中。子查询可以在允许表达式的任何地方使用。请参见子查询基础知识。你正在使用一个派生表,也称为内联视图,其中你将其命名为“SubTable”。 - KM.
@KM - 更新以提高准确性,但这并不是子查询的准确定义,它可以返回多个值而不仅仅是单个值。例如:Where ID IN (Select ID from Employees) - Nick Craver
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接