【问题标题】:Set default value in select statement(not use UNION statement)在 select 语句中设置默认值(不使用 UNION 语句)
【发布时间】:2013-04-08 08:16:43
【问题描述】:

我想要一个 SELECT 语句,如果数据库没有返回任何行,它将返回指定的默认值。

我们可以使用 UNION 来得到想要的结果,比如这个问题:“How to set a default row for a query that returns no rows?”,但这会给出一个额外的结果行。

示例:

SELECT a 
    from TBL_TEST 
UNION 
SELECT 0 
    FROM DUAL

有没有更好的方法或标准的 SQL 方法可以跨多个数据库引擎移植?

【问题讨论】:

  • 真正的 RDBMS 是什么?全部?
  • 是的,我使用 mysql、oracle 和 sql server :)
  • 这个问题看起来很相似:stackoverflow.com/questions/285666/…
  • 解决方案仍然是使用 UNION,所以当我在 select 语句中有很多列时,我认为它会导致性能不佳:)

标签: mysql sql sql-server oracle db2


【解决方案1】:
SELECT ifnull(a,20) FROM TBL_TEST 

如果a为null则选择20,否则选择a(在mysql中,其他不确定)

【讨论】:

  • 谢谢,它类似于SqlServer中的ISNULL,Oracle中的NVL,但不是真的:)
  • 当没有从表返回的行时,这并不能解决问题。
【解决方案2】:

对于便携式解决方案,如何:

select coalesce(a, 0)
    from TBL_TEST 
    right outer join DUAL on null is null

这里使用 COALESCE 函数是因为它比 NVL() 或 IFNULL() 更便携。

您将在使用不同名称(例如 SQL Server 或 DB2)的数据库系统中创建 DUAL 表。

【讨论】:

  • 感谢您的关注,所以在每个数据库系统中,我必须为每个查询使用或创建像 DUAL table(oracle) 这样的表:)
  • 或者您可以将等效表的名称替换为特定的 RDBMS。例如,在 DB2 for i 中,我们将使用 SYSIBM.SYSDUMMY1。
  • 其实对于DB2环境,你可以使用CREATE ALIAS DUAL FOR SYSIBM.SYSDUMMY1
【解决方案3】:

MySQL 有 DEFAULT 函数,但我不确定它的标准或广泛支持程度。

【讨论】:

  • 返回表列的默认值?我需要我在 sql 中输入的默认值,而不是在表结构中 :)
  • MySQL 也有简单的IFNULL() 方法将NULL 值转换为任何值。
【解决方案4】:
MySQL IFNULL is like oracle's NVL function 
MySQL IFNULL() takes two expressions and if the first expression is not NULL, it returns the first expression. Otherwise it returns the second expression.
Syntax 

IFNULL(expression1, expression2); 

SELECT IFNULL(a,<default value>) from TBL_TEST 

【讨论】:

  • 当没有从表返回的行时,正在寻求的解决方案将提供默认值。
【解决方案5】:

在甲骨文中:

select nvl(a, 0)
from DUAL left join TBL_TEST on null is null

【讨论】:

  • 从 DUAL 中选择 NVL(a,0),你确定吗?
  • 在 oracle 中运行良好,但我怀疑性能与使用 UNION 相比:-?
【解决方案6】:

使用 COALESCE() 将空值列转换为其默认值,例如

从 TBL_TEST 中选择 coalesce(a,0)

【讨论】:

  • 谢谢,它可以用于NULL值,但不能用于空值
  • 我检查了我的查询,它也在 mysql 中返回空值
  • 你创建一个没有数据的表,然后检查上面的sql,请:)
  • 当没有从表返回的行时,正在寻求的解决方案将提供默认值。
【解决方案7】:

在 SQL SERVER 2008 R2 中:当值为 NULL 时

SELECT ISNULL(a,<Default Value>) from TBL_TEST

e.g. SELECT ISNULL(a,0) from TBL_TEST

【讨论】:

  • 谢谢,它可以用于NULL值,但不能用于空值。
  • 如果有空字符串,首先使用 NULLIF 函数将空字符串转换为 null .....有关详细信息,请参阅我对这个问题的第二个答案......谢谢。
  • 好的,你尝试创建一个没有数据的表,然后使用上面的sql,请:)
  • 好吧,如果没有数据意味着表为空,以防此数据库引擎无法对表执行任何功能。功能和逻辑将适用于数据。对于空字符串和 null,您可以看到我的新答案,谢谢.... :)
  • 哦。如果您找到任何东西,这怎么可能,请告诉我:)。您可以定义任何默认值的另一件事是在 Oracle、Sql Server 和 any 中定义默认约束。因此,当您当时在该默认约束字段上发送空值时,它将自动为该空值插入默认值。让我知道进一步查询。
【解决方案8】:

在 SQL SERVER 2008 R2 中:空字符串时

SELECT ISNULL(NULLIF(a,<Empty String>)<Default Value>) from TBL_TEST

e.g. SELECT ISNULL(NULLIF(a,'')0) from TBL_TEST

这工作正常...

【讨论】:

    猜你喜欢
    • 2019-10-03
    • 2014-05-06
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多