在 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”子句来选择 SQL 语句中的所有记录?