我有一张简单的表
CREATE TABLE a(
id int IDENTITY(1,1) NOT NULL,
x varchar(50)
)
我发现以下查询有效
select cast (id as varchar(3))+cast (x as varchar(3)) c from a
where cast (id as varchar(3))+cast (x as varchar(3))='1a'
但这不起作用
select cast (id as varchar(3))+cast (x as varchar(3)) c from a
where c='1a'
有人知道为什么吗? 请不要因为某些原因我不想使用
where id=1 and x ='a'
答案 0 :(得分:8)
因为WHERE
子句中的表达式被计算为在表达式之前限制行,所以在select-list中计算别名。
这是一种解决方法:
select aprime.*
from (select cast (id as varchar(3))+cast (x as varchar(3)) c from a) aprime
where aprime.c='1a';
答案 1 :(得分:2)
你必须使用:
SELECT *
FROM (SELECT CAST(id AS VARCHAR(3)) + CAST(x AS VARCHAR(3)) AS 'output' FROM a) x
WHERE x.output = '1a'
答案 2 :(得分:1)
根据Bill Karwin的回答,我会考虑一个计算列来封装表达式,以便可以在别处重复使用
ALTER TABLE a ADD COLUMN c AS cast (id as varchar(3)) +cast (x as varchar(3))
答案 3 :(得分:1)
您可以使用Bill Karwin演示的子查询。但是:请我敦促你,不要这样做。请使用“不想使用”的where子句。
以下内容允许查询优化器确定要使用的索引并使查询高效运行。
where id=1 and x ='a'
以下(和Bill的等效文件)阻止查询优化器使用索引,并且会导致服务器上出现一般性能问题。
where cast (id as varchar(3))+cast (x as varchar(3))='1a'