CASE-WHEN后无法按别名过滤列不存在

问题描述

数据的类型为 jsonb

此处按电话号码过滤查询

SELECT id,data,CASE states->0->>'id'
    WHEN 'order.completed' THEN 'completed'
    ELSE 'progress'
    END AS order_state
FROM myTable
WHERE  data->'contacts'->'customer'->>'phone' LIKE '%123456%'

好。很好。

但是现在我也想按别名 order_state 进行过滤。

我尝试这个:

SELECT id,CASE states->0->>'id'
    WHEN 'order.completed' THEN 'completed'
    ELSE 'progress'
    END AS order_state
FROM myTable
WHERE  data->'contacts'->'customer'->>'phone' LIKE '%123456%' AND order_state = 'progress'

但是我得到了错误

ERROR:  column "order_state" does not exist
LINE 7: ...s'->'customer'->>'phone' LIKE '%123456%' AND order_stat...

解决方法

您的条件必须基于基本值。

... WHERE ... AND states->0->>'id' <> 'order.completed';

这使CASE选择变得毫无意义。