我经常遇到列名冲突,就像下面这个人为的例子:
with
weekdays('name') as (
values
('Monday')
, ('Tuesday')
, ('Wednesday')
, ('Thursday')
, ('Friday')
, ('Saturday')
, ('Sunday')
)
select
substr("name",1,3) as "name"
from weekdays
where 1==1
and "name" == 'Monday'
-- how do I reference current scope's name, where "name" == 'Mon'?
在bash中,应该是:
and ./"name" == 'Monday'
引用当前作用域的name
,而不是$PATH
中的第一个name
。
有没有办法在SQLite中引用当前作用域?
1条答案
按热度按时间lpwwtiir1#
标准SQL不允许在
WHERE
子句中使用派生列的别名,因为SELECT
是在WHERE
之后处理的。SQLite允许这样做(可能是通过将
WHERE
子句中的别名替换为其各自的表达式),但当名称与参与表/CTES的列发生冲突时,别名列将被现有列隐藏。这意味着在您的例子中,不能直接引用带别名的列。
相反,请重复该表达式:
或者,使用子查询:
或者,更好的做法是使用不同的非冲突别名。
请参阅demo。