我经常遇到列名冲突,如下面的人为示例:
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中引用当前范围?
标准 SQL 不允许在WHERE
子句中使用派生列的别名,因为SELECT
是在WHERE
之后处理的。
SQLite 允许这样做(可能是通过将WHERE
子句中的别名替换为其各自的表达式),但是当与参与表/ctes 的列发生名称冲突时,别名列将被现有列遮蔽。
这意味着,在您的情况下,您无法直接引用别名列。
而是重复表达式:
and substr("name",1,3) = 'Mon'
或者,使用子查询:
select *
from (
select
substr("name",1,3) as "name"
from weekdays
)
where 1=1
and "name" = 'Mon'
或者,最好使用不同的非冲突别名。
请参阅演示。