2017-01-23 3 views
1

У меня есть этот элемент в моем представлении базы данных:Как пользоваться Просмотр элементов внутри Где положение в SQL

CASE 
    WHEN Type = 'Reserved' THEN CAST(1 AS bit) 
    ELSE CAST(0 AS bit) 
    END AS isReserved, 

Я хочу использовать isReserved колонку в моем ИНЕКЕ. Как я могу это сделать? Благодарю.

+2

Используйте подзапрос, КТР, или повторить дефиниция. –

ответ

3

Вы можете использовать CROSS APPLY ... VALUES (в SQL Server - не заметил, он не был помечен для какой-либо конкретной СУБД)

SELECT isReserved 
FROM YourTable 
     CROSS APPLY (VALUES(CASE WHEN Type = 'Reserved' THEN CAST(1 AS BIT) 
          ELSE CAST(0 AS BIT) 
          END)) CA(isReserved) 
WHERE isReserved = 1 

Но вам, вероятно, лучше всего использовать Type = 'Reserved' и т. д. в вашем предложении WHERE, а не ссылаться на результат CASE. Таким образом, он может быть конвертирован и может использовать индекс.

1

Вы не можете сделать это напрямую.

Либо вы включаете подзапрос.

SELECT * 
FROM (SELECT <something> as newAlias FROM YourTable) as T 
WHERE T.newAlias = .... 

или просто повторить определение

SELECT * 
FROM YourTable 
WHERE <something> = .... 
1

Вы можете использовать то же самое выражение в том, где положение, и Oracle SQL не будет вычислять его снова, он будет получить результат из кэша

select CASE 
    WHEN Type = 'Reserved' THEN CAST(1 AS bit) 
    ELSE CAST(0 AS bit) 
    END AS isReserved 
from tablename 
where CASE 
    WHEN Type = 'Reserved' THEN CAST(1 AS bit) 
    ELSE CAST(0 AS bit) 
    END=CAST(0 AS bit) 
Смежные вопросы