Postgresql 需要在数组上循环的where子句的大小写

Postgresql 需要在数组上循环的where子句的大小写,postgresql,Postgresql,我有一个SELECT语句,需要根据asset\u store\u id选择记录asset\u store\u id作为空数组传递,或作为\u src\u asset\u store变量传递整数数组。如果数组为空,则应选择所有资产存储\u id,否则,仅应选择数组中的id 使用CASE-WHEN似乎是一种方法,但我似乎不知道如何将数组添加到其他方法中。我的代码如下所示: SELECT src.asset_store_id AS src_store ,src.

我有一个SELECT语句,需要根据
asset\u store\u id
选择记录
asset\u store\u id
作为空数组传递,或作为
\u src\u asset\u store
变量传递整数数组。如果数组为空,则应选择所有
资产存储\u id
,否则,仅应选择数组中的id

使用CASE-WHEN似乎是一种方法,但我似乎不知道如何将数组添加到其他方法中。我的代码如下所示:

    SELECT
        src.asset_store_id AS src_store
        ,src.asset_id AS src_asset_id
        ,dest.asset_id AS dest_asset_id
        ,dest.prior_asset_id AS dest_prior_asset_id
    FROM asset.assets AS src
    LEFT JOIN asset.assets AS dest
        ON dest.prior_asset_id = src.asset_id
    WHERE
        dest.asset_store_id = _dest_asset_store
        AND src.asset_store_id = CASE WHEN ARRAY_LENGTH(_src_asset_store, 1) = 0
                                    THEN src.asset_store_id
                                    ELSE IN(SELECT(UNNEST(_src_asset_store)))
                                END;

我尝试了ELSE语句的不同变体,包括ELSE ANY(_src_asset_store),但似乎没有任何效果

不能在案例内部和外部指定操作(=外部,在一个分支内部)。如果需要不同的操作,请将整个比较放在案例的每个分支中,并使其返回布尔值:

AND CASE WHEN ARRAY_LENGTH(_src_asset_store, 1) = 0
    THEN true
    ELSE src.asset_store_id IN(SELECT(UNNEST(_src_asset_store)))
END;
或者根本不使用案例

AND (ARRAY_LENGTH(_src_asset_store, 1) = 0 or src.asset_store_id IN(SELECT(UNNEST(_src_asset_store))) )
但我也会避免最不必要的事情:

AND (ARRAY_LENGTH(_src_asset_store, 1) = 0 or ARRAY[src.asset_store_id] && _src_asset_store )
src.asset\u store\u id IN(SELECT(unest(\src\u asset\u store))
可以简化为
src.asset\u store\u id=ANY(\u src\u asset\u store)