如何解决PostgreSQL使用CASE根据其他数据的存在返回不同的数据
我试图创建一个查询,该查询根据数据库中某些数据的存在返回不同的值。 如果数据存在,我希望返回该数据(x列),如果数据不存在,则返回“ count” = 0。
我尝试过:
WITH cart AS (
SELECT o.id AS order_id,o.ecom_id,COUNT(op.id) as count_product
FROM order_products op
JOIN orders o ON op.order_id = o.id
JOIN order_status os ON os.id = o.status
WHERE dealer_id = 19 AND os.level = 0
GROUP BY o.id,o.ecom_id limit 1
),cart_b AS(
SELECT EXISTS(SELECT * FROM cart) cart_full
)
SELECT CASE
WHEN cart_full is True THEN(SELECT order_id,ecom_id FROM cart)
ELSE (SELECT 0 AS count_product)
END
FROM cart_b
问题是:
ERROR: subquery must return only one column
LINE 15: WHEN cart_full is True THEN(SELECT dropix_order_id,ecom_id ...
我理解原因,但是我不知道如何避免这种情况并从购物车返回所有数据。
没有plpgsql函数是否可能?
解决方法
这是您想要的吗?
with cart as (...)
select order_id,ecom_id,count_product from cart
union all
select x.*
from (values(null,null,0)) as x(order_id,count_product)
where not exists (select 1 from cart)
查询在cte中运行。如果它返回某些内容,则将其用作结果。否则,我们返回一条记录,其中前两列的值固定为null
,计数为0
。
您要返回的内容:
IF cart_full is True THEN
SELECT order_id,ecom_id FROM cart
ELSE
SELECT 0 AS count_product
不能作为单个查询返回。为什么?因为有不同的列。我建议您返回所有三列。如果没有行,则其他列将为NULL
。
为此,您可以使用如下查询:
WITH cart AS (
SELECT o.id AS order_id,o.ecom_id,COUNT(op.id) as count_product
FROM order_products op JOIN
orders o
ON op.order_id = o.id JOIN
rder_status os ON os.id = o.status
WHERE dealer_id = 19 AND os.level = 0
GROUP BY o.id,o.ecom_id
LIMIT 1
)
SELECT o.id AS order_id,count_product
FROM cart
UNION ALL
SELECT NULL,NULL,0
WHERE NOT EXISTS (SELECT 1 FROM cart)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。