sqlite 如何引用当前作用域?

7fhtutme  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(142)

我经常遇到列名冲突,就像下面这个人为的例子:

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中引用当前作用域?

lpwwtiir

lpwwtiir1#

标准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'

或者,更好的做法是使用不同的非冲突别名。
请参阅demo

相关问题