You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL中CASE语句别名筛选触发ORA-00904报错的解决咨询

在Oracle SQL里,WHERE子句的执行顺序早于SELECT子句——也就是说当数据库处理WHERE条件的时候,SELECT里定义的别名STATUS_TEST还未被创建,所以不管你给别名加不加AS或者引号,都会触发ORA-00904错误。

没法直接在WHERE里用SELECT定义的CASE别名,不过有几种替代方案可以实现需求:


方案1:使用子查询

把包含CASE逻辑的查询作为子查询,在外层WHERE里筛选别名:

SELECT *
FROM (
    SELECT transfer_order_number, item_number, item_description, requested_qty, received_qty, shipped_qty, 
            CASE 
        WHEN shipped_qty = requested_qty THEN 'Shipped'
        WHEN shipped_qty < requested_qty THEN 'Partially Shipped'
        WHEN shipped_qty = requested_qty AND received_qty < requested_qty THEN 'Shipped and Partially Received'
        WHEN shipped_qty < requested_qty AND received_qty < requested_qty THEN 'Partially Shipped and Partially Received'
        WHEN shipped_qty = requested_qty AND received_qty = requested_qty THEN 'Shipped and Received'
        WHEN shipped_qty IS NULL THEN 'Awaiting Fulfillment'
        END STATUS_TEST
    FROM TransferOrder_TABLE
) t
WHERE t.STATUS_TEST = 'Partially Shipped and Partially Received'

方案2:使用CTE(公共表表达式)

用WITH子句先构建包含状态字段的临时结果集,再筛选:

WITH transfer_status AS (
    SELECT transfer_order_number, item_number, item_description, requested_qty, received_qty, shipped_qty, 
            CASE 
        WHEN shipped_qty = requested_qty THEN 'Shipped'
        WHEN shipped_qty < requested_qty THEN 'Partially Shipped'
        WHEN shipped_qty = requested_qty AND received_qty < requested_qty THEN 'Shipped and Partially Received'
        WHEN shipped_qty < requested_qty AND received_qty < requested_qty THEN 'Partially Shipped and Partially Received'
        WHEN shipped_qty = requested_qty AND received_qty = requested_qty THEN 'Shipped and Received'
        WHEN shipped_qty IS NULL THEN 'Awaiting Fulfillment'
        END STATUS_TEST
    FROM TransferOrder_TABLE
)
SELECT *
FROM transfer_status
WHERE STATUS_TEST = 'Partially Shipped and Partially Received'

方案3:在WHERE子句中重复CASE逻辑

这种方法不需要嵌套查询,但会让代码冗余,适合简单的CASE逻辑:

SELECT transfer_order_number, item_number, item_description, requested_qty, received_qty, shipped_qty, 
        CASE 
    WHEN shipped_qty = requested_qty THEN 'Shipped'
    WHEN shipped_qty < requested_qty THEN 'Partially Shipped'
    WHEN shipped_qty = requested_qty AND received_qty < requested_qty THEN 'Shipped and Partially Received'
    WHEN shipped_qty < requested_qty AND received_qty < requested_qty THEN 'Partially Shipped and Partially Received'
    WHEN shipped_qty = requested_qty AND received_qty = requested_qty THEN 'Shipped and Received'
    WHEN shipped_qty IS NULL THEN 'Awaiting Fulfillment'
    END STATUS_TEST
FROM TransferOrder_TABLE
WHERE CASE 
    WHEN shipped_qty = requested_qty THEN 'Shipped'
    WHEN shipped_qty < requested_qty THEN 'Partially Shipped'
    WHEN shipped_qty = requested_qty AND received_qty < requested_qty THEN 'Shipped and Partially Received'
    WHEN shipped_qty < requested_qty AND received_qty < requested_qty THEN 'Partially Shipped and Partially Received'
    WHEN shipped_qty = requested_qty AND received_qty = requested_qty THEN 'Shipped and Received'
    WHEN shipped_qty IS NULL THEN 'Awaiting Fulfillment'
    END = 'Partially Shipped and Partially Received'

内容的提问来源于stack exchange,提问作者Ninna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:43:24