【问题标题】:SQL IFNULL on SELECT * statementSELECT * 语句上的 SQL IFNULL
【发布时间】:2016-06-09 22:07:50
【问题描述】:

有没有办法为所有返回的值为 null 的值设置默认值,特别是在 MySql 中?

代替

SELECT 
  IFNULL(foo, 0),
  IFNULL(bar, 0),
  IFNULL(baz, 0)
FROM table

我想做这样的事情:

SELECT IFNULL(*, 0)
FROM table

// this does not work, but I'm looking for something like it

【问题讨论】:

  • 不,在 SQL 中没有办法做到这一点。
  • 感谢您的反馈,以及其他任何看到这篇文章的人,我不能在每个项目上放置 IFNULL 的原因是因为我正在以 ORM 样式动态生成 SQL ,所以我既不知道返回的列数,也不知道这些列的数据类型,但我随后 LEFT JOIN 与另一个表(例如,天数表)并从动态表中执行 select *。

标签: mysql sql ifnull


【解决方案1】:

SQL 中函数的结果是单个值(列),而不是列列表。所以不存在,也不可能存在这样的结构。不幸的是,您必须单独处理每一列。

【讨论】:

  • 不是我希望的答案,但肯定很高兴知道。
【解决方案2】:

如果您不关心保留NULL,可以将默认值添加到表中:

ALTER TABLE yourTable ALTER foo SET DEFAULT 0;

您还可以创建一个视图,在其中写出每个 IFNULL() 语句一次,然后使用它来避免一直重新键入它。

但正如其他人所指出的,没有任何构造可以像您希望的那样简单地做到这一点。

您还可以使用表元数据快速执行类似这样的重复操作:

SELECT CONCAT("IFNULL(",`COLUMN_NAME`,",0)")
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='yourtablename';

【讨论】:

  • 不幸的是,我的选择中的许多值都是计算值,并且在某些表中我确实希望表中有空值,但在生成的报告中却没有。
【解决方案3】:

你可以试试下面的sql case语句

    select 
CASE 
  WHEN foo is null THEN 0  else foo end

  from urtable

其他列也一样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2014-11-03
    相关资源
    最近更新 更多