SQL Использовать псевдоним в выражении Where - PullRequest
30 голосов
/ 03 апреля 2009

Я думаю, как использовать псевдоним в операторе where.

Пример:

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

Я использую MSSQL 2005

Ответы [ 10 ]

51 голосов
/ 26 июня 2013

Вы можете использовать «иметь» вместо «где».

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

Выполнение «где» после выполнения запроса. Будьте осторожны, используйте его в правильных условиях, чтобы не было проблем с производительностью.

19 голосов
/ 03 апреля 2009

Невозможно, но вы можете сделать следующее:

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

Никаких подзапросов или хаков не требуется

16 голосов
/ 03 апреля 2009

Использовать подзапрос:

SELECT * 
FROM 
  (SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 FROM MyTable)
WHERE Col1 = 'MySearch'
8 голосов
/ 04 апреля 2009

Вы можете сделать это:

SELECT Col1
FROM ( SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 ) AS x
WHERE Col1 = 'MySearch'
5 голосов
/ 03 апреля 2009
SELECT * FROM (
  SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1
  FROM MyTable
)
WHERE Col1 = 'MySearch'

(Я знаю, что это работает в Oracle, я считаю, что это стандартный SQL и будет работать в MSSQL.)

1 голос
/ 04 апреля 2009

На самом деле, использование псевдонима не ускорит ваш запрос, так как оптимизатор SQL не так глуп, как вы думаете, поэтому я просто повторю выражение SUBSTRING снова.

1 голос
/ 04 апреля 2009

использовать представление или производную таблицу.

Используя производную таблицу, ваш пример будет выглядеть так:

select col1 
from 
(SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1
FROM MyTable) 
where col1='Mysearch'
1 голос
/ 03 апреля 2009

Я думаю, что это невозможно, но, возможно, вы можете взглянуть на Common Table Expressions по 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'
0 голосов
/ 30 мая 2018

В 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'

С этим синтаксисом вам не нужно использовать '*', который может быть неэффективным, или заново скопировать все столбцы.

0 голосов
/ 04 апреля 2009

Ответ вы не можете - вы можете сделать это

SELECT 
    SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3)  AS Col1
FROM 
    MyTable
WHERE 
    SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) = 'MySearch'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...