【问题标题】:MySQL return values when no rows found未找到行时 MySQL 返回值
【发布时间】:2015-09-24 17:06:04
【问题描述】:

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

这样我就不必在显示这些数据时使用任何逻辑...我可以将其推出。

我想要做的是总是返回 3 Warehouses... 000 CAL RET,当什么都没有找到时,值为 0。

如果添加了新仓库,我希望能够对其进行修改以包括该仓库。

这里是:

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

我想为 RET 仓库返回另一行,所有列都为零。

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

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

我已经搜索过答案,但似乎找不到我需要的确切答案。

谢谢!

【问题讨论】:

标签: mysql


【解决方案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,并且默认行将匹配。

【讨论】:

  • 您的查询中有一个小错误,应该是SELECT querytype, col1, col2, col3, ...。否则,查询类型将找不到。
【解决方案2】:

您可以创建一个仓库主表,每列都为 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),

然后您的查询可以加入此表并对两组数据执行合并,对于每一列,您应该有一个来自主表的 0 和来自您的数据库的值,如果您的数据库中的值为空,它将从“主”表中取 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'

【讨论】:

  • 实际上这似乎非常接近工作,但是当我使用不存在的项目代码查询它时,我没有得到任何值。据我所知,它也没有填充空行。
  • 啊,where 应该是连接的一部分,所以它只连接那些匹配字符串的记录。
【解决方案3】:

我刚刚遇到了同样的情况,我可以设法以与 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。 我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多