我想知道如何在where语句中使用别名。
示例:
SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1
FROM MyTable
WHERE Col1 = 'MySearch'
我使用MS SQL 2005
答案 0 :(得分:51)
您可以使用“having”而不是“where”。
SELECT
SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1
FROM
MyTable
HAVING
Col1 = 'MySearch'
在执行查询后执行“where”。 小心在合适的条件下使用它以避免性能问题。
答案 1 :(得分:19)
不可能,但您可以执行以下操作:
SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1
FROM MyTable
WHERE SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) = 'MySearch'
不需要子查询或黑客
答案 2 :(得分:16)
使用子查询:
SELECT *
FROM
(SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 FROM MyTable)
WHERE Col1 = 'MySearch'
答案 3 :(得分:8)
你可以这样做:
SELECT Col1
FROM ( SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 ) AS x
WHERE Col1 = 'MySearch'
答案 4 :(得分:5)
SELECT * FROM (
SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1
FROM MyTable
)
WHERE Col1 = 'MySearch'
(我知道这在Oracle中有效,我相信它是标准的SQL,可以在MSSQL中使用。)
答案 5 :(得分:1)
我认为这是不可能的,但也许你可以看看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'
答案 6 :(得分:1)
使用视图或派生表。
使用派生表,您的示例如下所示:
select col1
from
(SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1
FROM MyTable)
where col1='Mysearch'
答案 7 :(得分:1)
实际上,使用别名不会让你的查询更快,因为SQL优化器并不像你想象的那样愚蠢,所以我只是再次重复SUBSTRING表达式。
答案 8 :(得分:0)
答案是你做不到 - 你可以做到这一点
SELECT
SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1
FROM
MyTable
WHERE
SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) = 'MySearch'
答案 9 :(得分:0)
使用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'
使用此语法,您不必使用可能无法执行的“*”或重新复制所有列。