Sql выберите запрос с где из нескольких столбцов - PullRequest
0 голосов
/ 22 декабря 2009

У меня есть простая таблица

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 ]

8 голосов
/ 22 декабря 2009

Поскольку выражения в предложении WHERE вычисляются для ограничения строк до того, как выражения и псевдонимы вычисляются в списке выбора.

Вот обходной путь:

select aprime.*
from (select cast (id as varchar(3))+cast (x as varchar(3)) c from a) aprime
where aprime.c='1a';
2 голосов
/ 22 декабря 2009

Вы должны использовать:

SELECT *
  FROM (SELECT CAST(id AS VARCHAR(3)) + CAST(x AS VARCHAR(3)) AS 'output' FROM a) x
 WHERE x.output = '1a'
1 голос
/ 22 декабря 2009

Вы можете использовать подзапрос, как продемонстрировал Билл Карвин. Однако: Пожалуйста, Я призываю вас, , не делайте этого . Пожалуйста, используйте предложение where, которое вы «не хотите использовать».

Следующее позволяет оптимизатору запросов определять индекс для использования и эффективно выполнять запрос.

where id=1 and x ='a'

Следующий (и эквивалент Билла) запрещает оптимизатору запросов использовать индексы и будет способствовать общим проблемам с производительностью на вашем сервере.

where cast (id as varchar(3))+cast (x as varchar(3))='1a'
1 голос
/ 22 декабря 2009

Опираясь на ответ Билла Карвина, я бы посчитал вычисляемый столбец для инкапсуляции выражения, чтобы его можно было использовать в другом месте

ALTER TABLE a ADD COLUMN c AS cast (id as varchar(3)) +cast (x as varchar(3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...