unnest(case when (next_plan_id is null or next_plan_id[1] is null) then ARRAY[-1]::integer[] else next_plan_id end)
时间: 2024-03-29 13:36:25 浏览: 17
这是一个 PostgreSQL 数据库中的 SQL 查询语句,用于将一个包含 NULL 值的数组展开成一个单独的列。具体来说,它使用了一个 CASE WHEN 子句来检查数组中是否存在 NULL 值,如果存在,则将其替换为包含一个 -1 整数值的数组,否则将数组展开。最后,它使用了 unnest 函数将展开后的数组转换为单独的列。
相关问题
select ddp.sale_planid ,unnest(case when(ddp.plan_receiver_id is null or ddp.plan_receiver_id[1] is null) then ARRAY[-1]::integer[] else ddp.plan_receiver_id end) cabinet_rule_id_r from ( select dp.plan_receiver_id --unnest(case when dp.cabinet_rule_id is null or dp.cabinet_rule_id[1] is null then ARRAY[-1]::integer[] else dp.cabinet_rule_id end ) cabinet_rule_id_r ,unnest(case when (dp.next_plan_id is null or dp.next_plan_id[1] is null) then ARRAY[-1]::integer[] else dp.next_plan_id end) as sale_planid --销地计划 from ods.ods_durian_delivery_plan AS dp where dp.type='ORIGIN') ddpSQL纠错
这段 SQL 语句存在语法错误。应该将 `CASE` 表达式的 `THEN` 和 `ELSE` 子句中的 `ARRAY[-1]::integer[]` 改为 `ARRAY[-1]`,同时在 `FROM` 子句中给子查询指定一个别名。修改后的 SQL 语句如下:
```
SELECT ddp.sale_planid, unnest(CASE WHEN (ddp.plan_receiver_id IS NULL OR ddp.plan_receiver_id[1] IS NULL) THEN ARRAY[-1] ELSE ddp.plan_receiver_id END) AS cabinet_rule_id_r
FROM (
SELECT dp.plan_receiver_id, unnest(CASE WHEN (dp.next_plan_id IS NULL OR dp.next_plan_id[1] IS NULL) THEN ARRAY[-1] ELSE dp.next_plan_id END) AS sale_planid
FROM ods.ods_durian_delivery_plan AS dp
WHERE dp.type = 'ORIGIN'
) ddp;
```
SQL优化 SELECT id AS origin_planid ,unnest(cabinet_rule_id) cabinet_rule_id -- 判断 next_plan_id 本身是空和 next_plan_id 为 {} ,unnest(case when (next_plan_id is null or next_plan_id[1] is null) then ARRAY[-1]::integer[] else next_plan_id end) as sale_planid --销地计划 , case when dp.plan_receiver_id is null then -1 else dp.plan_receiver_id end orig_plan_rid_r --产地计划 FROM ods.ods_durian_delivery_plan as dp left join ods.ods_hl_commodity_category as hcc on hcc.category_id = dp.category_id WHERE dp.type = 'ORIGIN' AND dp.deleted = 99 AND dp.tenant_id = 1 and dp.cabinet_rule_id='{8}'or dp.cabinet_rule_id='{9}'or dp.cabinet_rule_id='{10000005}'---取白心火龙果 AND hcc.category_name = '火龙果'
这个SQL查询语句中存在一些可以优化的地方。首先,可以将多个OR条件的判断转化为IN条件的判断,例如将:
```
and dp.cabinet_rule_id='{8}'or dp.cabinet_rule_id='{9}'or dp.cabinet_rule_id='{10000005}'
```
转化为:
```
and dp.cabinet_rule_id in ('{8}', '{9}', '{10000005}')
```
这样可以使SQL查询更加简洁、易读,并且可能会提高查询性能。
其次,需要考虑对表中的字段添加索引来加速查询。如可以为`ods_durian_delivery_plan`表中的`type`、`deleted`、`tenant_id`、`category_id`、`cabinet_rule_id`字段添加索引,以加速查询效率。