代码之家  ›  专栏  ›  技术社区  ›  Tim

如何仅显示列值大于零的行?

  •  0
  • Tim  · 技术社区  · 2 年前

    我一直在做我可以使用的第一个MySQL查询,但我被卡住了。我可以查询我想要的数据,但不能排除特定列中值为0或更小的行。为了创建有问题的列(剩余数量),我在SELECT语句中使用了减法运算符(-)。我希望这是一个合理的方法,但我试图排除0或更小的值,但没有成功。下面的查询:

    SELECT 
        po.num AS "PO Number",
        DATE_FORMAT(poitem.dateScheduledFulfillment,"%c/%e/%Y") AS "Date Scheduled",
        poitem.partNum AS "Part Number",
        poitem.description AS "Part Description",
        (poitem.qtyToFulfill - poitem.qtyFulfilled) AS "Qty Remaining",
        poitemstatus.name AS "Status"
    FROM poitem
    JOIN poitemstatus ON poitemstatus.id=poitem.statusId
    JOIN po ON po.id=poitem.poId
    WHERE poitem.statusId="30" OR poitem.statusId="10" 
        AND NOT poitem.typeid="11"
        AND NOT poitem.typeid="21"
    ORDER BY "Date Scheduled"
    

    我尝试了一些不同的AND语句来排除有问题的行。在0周围没有引号的语句似乎排除了太多的行,但仍包含带零的行。带引号的语句似乎不会影响结果。

    AND "Qty Remaining" > 0
    AND "Qty Remaining" <> 0
    AND "Qty Remaining" > "0"
    AND "Qty Remaining" <> "0"
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Joel Coehoorn    2 年前

    在SQL中,您需要单引号( ' ),不是双引号( " ),用于字符串值。SQL标准为对象名称保留双引号,因此 AND NOT poitem.typeid="11" 正在尝试比较 poitem.typeid 用一个 命名为“11”。

    此外 OR 可能没有做到你所期望的;这里的运算符优先级往往会让人惊讶。您几乎总是需要在 比较,但在这种情况下,我们可以使用 IN() .

    WHERE poitem.statusId IN (30, 10)
        AND poitem.typeid NOT IN (11, 21)
        AND (poitem.qtyToFulfill - poitem.qtyFulfilled) > 0