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

Posted

技术标签:

【中文标题】在 WHERE 子句中使用 SQL 2005 中的命名自定义列?【英文标题】:Use a named custom column in SQL 2005 in WHERE clause? 【发布时间】:2010-04-01 17:48:55 【问题描述】:

是否可以在 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 年不再可行。

谢谢。

【问题讨论】:

什么是“自定义列”,另一种叫什么? 我怀疑这是公认的术语。我只是指我在返回数据之前对其执行一些操作的列。 【参考方案1】:

您可以使用 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%' 

;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

【讨论】:

小心子选择嵌套太深。这可能不仅会降低性能,而且可能会使其很难维护。想想 temp/var 表,或者 cte 查询…… 我不熟悉 CTE,在这种情况下我只需要一个 SUB SELECT。不过,查看文档,似乎 CTE 可能是要走的路。也可以清理一下我的代码。 好的,CTE 更令人愉快。谢谢你把他们介绍给我。 您知道,您可以随时随地选择多个 CTE。如果您想了解更多信息,但找不到文档,我很乐意为您提供帮助 X-) 你的意思是你可以有两个 CTE 块并在下面的 SELECT 中同时使用吗?【参考方案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%'

【讨论】:

这是一个已经很庞大的 SELECT。将它包装在另一个影响性能很大吗? @Orange Kid:使用子查询将保证另一次表扫描 - 虽然重复,但在一个查询中执行只会执行一次表扫描 - 使其性能更高。 @OMG Ponies - 糟糕,在 oracle 中太久了,已修复。 嘿小马,你注意到了吗,你今天的照片看起来没什么不同>:-) @Nick Craver,您的答案没有使用子查询。子查询是返回单个值的 SELECT 查询,嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或另一个子查询中。子查询可以在任何允许使用表达式的地方使用。请参阅Subquery Fundamentals您正在使用派生表,也称为内联视图,您将其命名为“子表”

以上是关于在 WHERE 子句中使用 SQL 2005 中的命名自定义列?的主要内容,如果未能解决你的问题,请参考以下文章

关于 Where 子句的 T-Sql 多重标准

SQL在where子句中使用子选择中的列

是否可以使用“WHERE”子句来选择 SQL 语句中的所有记录?

在 WHERE 子句 SQL 中使用别名 [重复]

变量作为 Oracle PL/SQL 中 where 子句中的列名

在 where 子句 SQL 中的 case 语句中使用参数