我在数据库视图中有这个元素:
CASE
WHEN Type = 'Reserved' THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS isReserved,
我想在WHERE子句中使用isReserved列。我怎样才能做到这一点?感谢。
答案 0 :(得分:3)
您可以使用CROSS APPLY ... VALUES
(在SQL Server中 - 没有注意到它没有被标记为任何特定的DBMS)
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
但是你最好直接在你的WHERE子句中使用Type = 'Reserved'
等,而不是反过来引用CASE结果。这样它就可以使用索引了。
答案 1 :(得分:1)
你不能直接这样做。
要么包含子查询。
SELECT *
FROM (SELECT <something> as newAlias FROM YourTable) as T
WHERE T.newAlias = ....
或只是重复定义
SELECT *
FROM YourTable
WHERE <something> = ....
答案 2 :(得分:1)
你可以在where子句中使用相同的表达式,oracle sql不会再次计算它,它会从缓存中获得结果
{{1}}