没有找到行时MySQL返回值

时间:2015-09-24 17:06:04

标签: mysql

即使没有找到使用默认值模拟正确结果集的行,我也希望返回MySQL结果集。

这样我就不必在显示这些数据时有任何逻辑......我可以把它推出来。

我想做的是总是返回3个仓库... 000 CAL RET,当找不到任何值时,值为0。

如果要添加新仓库,我希望能够修改此仓库以包含该仓库。

这里是:

http://sqlfiddle.com/#!9/e94bc

我想在RET仓库中返回另一行,所有列都包含零。

如果你查询另一个不存在的ItemCode,我想看到所有3行000 CAL RET,每列中的值为零。

作为奖励,我也希望始终返回0而不是(NULL)作为值。

我已经搜索了答案,但似乎无法找到我需要的答案。

谢谢!

3 个答案:

答案 0 :(得分:1)

SELECT querytype, col1, col2, col3, ...
FROM (SELECT 1 AS querytype, col1, col2, col3, ...
      FROM YourTable
      WHERE ...
      UNION ALL
      SELECT 2 AS querytype, 0, 0, 0, ...
      UNION ALL
      SELECT 2 AS querytype, 0, 0, 0, ...
      UNION ALL
      SELECT 2 AS querytype, 0, 0, 0, ...) AS x
HAVING querytype = MIN(querytype)

第一个UNION ALL之前的所有内容都是您的常规查询,但添加了querytype列。如果该查询返回任何内容,MIN(querytype)将为1,并且这些行将与HAVING子句匹配。否则,MIN(querytype)将为2,默认行将匹配。

答案 1 :(得分:0)

您可以创建仓库的主表,每列都为0。

CREATE TABLE ItemWarehouseMaster
    (`Warehouse` varchar(3), `QOH` int, `QPO` int, `QSO` int, `QBO` int,`ItemCode` varchar(8))
;

INSERT INTO ItemWarehouseMaster
    (`Warehouse`, `QOH`, `QPO`, `QSO`, `QBO`, `ItemCode`)

    ('CAL', 0, 0, 0, 0, 0),
    ('RET', 0, 0, 0, 0, 0),
    ('000', 0, 0, 0, 0, 0),

然后你的查询可以加入这个表并对2组数据进行合并,对于每一列,你应该从mastertable和数据库中获得0,如果数据库中的值为null,它将会从主人那里拿走0'表

SELECT
    w.Warehouse,
    coalesce (w.QOH,Mast.QOH),
    coalesce (w.QSO,Mast.QSO),
    coalesce (w.QPO,Mast.QPO),
    coalesce (w.QBO,Mast.QBO)
FROM
    ItemWarehouseMaster Mast
left join
     ItemWarehouse w on
w.warehouse = mast.warehouse

And w.itemcode = '10052IP'

答案 2 :(得分:0)

我刚刚面临同样的情况,我可以设法以与Barmar描述的方式类似的方式返回值,但稍微更简单。

SELECT mycol FROM (
  SELECT mycol FROM mytable WHERE condcol = 'some value' 
  UNION SELECT 'hardcoded value'
) alias
LIMIT 1;

如果第一个查询没有返回任何行,则第二个查询将始终返回硬编码值。如果您需要返回更多硬编码行,只需根据需要添加UNION SELECT 'another value'次。 最后的LIMIT语句可以确保在找到实际行时不会返回硬编码的行。

请注意,您的原始查询将成为派生查询,并且必须具有别名。否则,您将看到此错误: Error in query (1248): Every derived table must have its own alias。 我希望这有帮助!