Sql选择查询与多列的位置

时间:2009-12-22 06:51:19

标签: sql sql-server tsql string

我有一张简单的表

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'

4 个答案:

答案 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'