为什么这不返回0

时间:2019-08-22 20:25:34

标签: sql oracle

我有一个查询,例如:

remove_action('woocommerce_single_product_summary','woocommerce_template_single_title', 5);
add_action('woocommerce_single_product_summary', 'woocommerce_new_single_title', 5);

        if ( ! function_exists( 'woocommerce_new_single_title' ) ) {
                function woocommerce_new_single_title() {
                    $product = wc_get_product( $post_id );
                    $product->get_regular_price();
                    $product->get_sale_price();
                    $product->get_price();
                    $pprice = $product->get_price();
            ?>
            <h1 itemprop="name" class="product_title entry-title"><span><?php the_title(); ?>:&nbsp;<?php $product->get_price(); ?></span></h1>
        <?php
    }
}

查询运行正常,但不返回任何值。如果找不到数量,我希望它返回0。我在哪里弄错了?

4 个答案:

答案 0 :(得分:2)

如果所有行都被过滤掉,则带有GROUP BY的聚合查询将不返回任何行。

具有 no GROUP BY的聚合查询始终返回一行,即使所有行都被过滤掉了。

因此,只需删除GROUP BY。并将SELECT更改为:

select coalesce(sum(a.quantity), 0) - coalesce(max(cc.quantityCor), 0) 

答案 1 :(得分:1)

我可能是错的,但是看来您只是想从发货数量7085740的交货数量中减去正确的数量。您不需要为此进行复杂的查询。尤其是您追求的GROUP BY子句毫无意义。

编写此查询的一种方法是:

select 
  sum(case when transaction_type = 'DELIVER' then quantity else 0 end) -
  sum(case when transaction_type = 'CORRECT' then quantity else 0 end) as diff
from rcv_transactions
where shipment_line_id = 7085740;

答案 2 :(得分:0)

我遇到了这样的查询,并在商品无效时尝试返回“ X”。

SELECT case when segment1 is not null then segment1 else 'X' end
--INTO v_orgValidItem
FROM mtl_system_items_b
WHERE segment1='1676001000'--'Jul-00'--l_item
     and organization_id=168;

..但是它返回NULL。

已更改为不使用分组依据使用聚合,现在当该项目无效时返回“ X”。

SELECT case when max(segment1) is not null then max(segment1) else 'X' end valid
--INTO v_orgValidItem
FROM mtl_system_items_b
WHERE segment1='1676001000'--'Jul-00'--l_item
    and organization_id=168;--l_ship_to_organization_id_pb;

答案 3 :(得分:0)

这是另一个例子,证明操作顺序确实很重要。

当此报价编号不匹配时,此查询返回NULL:

SELECT MAX(NVL(QUOTE_VENDOR_QUOTE_NUMBER,0)) 
    FROM PO_HEADERS_ALL 
    WHERE QUOTE_VENDOR_QUOTE_NUMBER='foo.bar';

..颠倒MAX和NVL的顺序会带来所有不同。该查询返回NULL值条件:

SELECT NVL(MAX(QUOTE_VENDOR_QUOTE_NUMBER),0) 
    FROM PO_HEADERS_ALL 
    WHERE QUOTE_VENDOR_QUOTE_NUMBER='foo.bar';