SQL在Where语句中使用别名

SQL在Where语句中使用别名,sql,Sql,我想知道我如何在where语句中使用别名 例如: SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 FROM MyTable WHERE Col1 = 'MySearch' 我使用MSSQL 2005我认为这是不可能的,但也许您可以看看SQL 2005上的常用表表达式 像这样: WITH MyCTE( Col1) AS ( SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING

我想知道我如何在where语句中使用别名

例如:

SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1
FROM MyTable
WHERE Col1 = 'MySearch'

我使用MSSQL 2005

我认为这是不可能的,但也许您可以看看SQL 2005上的常用表表达式

像这样:

WITH MyCTE( Col1) AS
(
SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1
FROM MyTable
)
SELECT *
FROM MyCTE
WHERE Col1 = 'MySearch'
(我知道这在Oracle中是有效的,我相信这是标准SQL,在MSSQL中也是有效的。)

使用子查询:

SELECT * 
FROM 
  (SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 FROM MyTable)
WHERE Col1 = 'MySearch'

不可能,但您可以执行以下操作:

SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1
FROM MyTable
WHERE SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) = 'MySearch'

不需要子查询或hack

使用视图或派生表

使用派生表,您的示例如下所示:

select col1 
from 
(SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1
FROM MyTable) 
where col1='Mysearch'

答案是你不能-你可以这样做

SELECT 
    SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1
FROM 
    MyTable
WHERE 
    SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) = 'MySearch'

实际上,使用alias不会使查询更快,因为SQL optimizer并不像您想象的那样愚蠢,所以我只需再次重复子字符串表达式。

您可以这样做:

SELECT Col1
FROM ( SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 ) AS x
WHERE Col1 = 'MySearch'
你可以用having代替where

在执行查询后执行“where”。
请注意在正确的条件下使用它,以免出现性能问题。

对于PostgreSQL 9.3+或Oracle 12c,现在有了允许创建别名的横向联接

横向连接是指可以参考前面表格的内部连接

SELECT col1, col2,col3
FROM MyTable m
JOIN LATERAL (
    SELECT SUBSTRING(m.Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1 
) x ON true
WHERE Col1 = 'MySearch'

使用这种语法,您不必使用可能出现问题的“*”或重新复制所有列。

但是,如果内部查询变得复杂,则可能会更慢。在postgresql中,我们需要在
WHERE
子句之前将内部子查询命名为smth,他正在寻找一种更易于阅读的方法,这有点违反了枯燥的原则,不是吗?修改select子句时,必须确保同时修改WHERE…添加子查询或使用Having将使查询更加复杂,这比重复两次这样简单的表达式更糟糕。但是,如果创建col1的函数要求更高,该怎么办。然后运行两次(本例中为子字符串4次),然后复制代码。select子句中的语句与where子句中的语句相同,这使维护工作量加倍。这是最容易实现和最通用的解决方案。我不知道为什么投票不多。这是正确的答案。这对我不起作用。您确定这是正确答案吗?在MS SQL Server中,仅使用聚合函数。2012年和2016年测试。
SELECT
    SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1
FROM
    MyTable
HAVING
    Col1 = 'MySearch'
SELECT col1, col2,col3
FROM MyTable m
JOIN LATERAL (
    SELECT SUBSTRING(m.Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1 
) x ON true
WHERE Col1 = 'MySearch'