【问题标题】:Return a value if select returned null如果选择返回 null,则返回一个值
【发布时间】:2014-01-12 16:40:45
【问题描述】:

如果选择返回 null,我需要返回一个值。但是我通过将查询放入子查询中找到了解决方案here

SELECT COALESCE((SELECT id FROM tbl WHERE id = 9823474), 4) AS id FROM RDB$DATABASE;

上面的查询将返回Null,因为表中不存在值 9823474 但我想在这种情况下返回一个值(例如 4),所以我找到了在子查询中使用 select 的唯一解决方案,然后COALESCE 会起作用,如果我不这样做,COALESCE 也会返回 Null

这是唯一的解决方案吗?

【问题讨论】:

  • 向我们提供更多关于您打算如何使用该值的信息?你使用什么编程语言?
  • 不清楚您的查询应该做什么。你能edit 更具体一点吗?内部SELECT 尝试从 Tbl 中获取 ID,如果找不到则返回 4,但是 RDB$DATABASE 在哪里适合?根本不需要,除非有什么你没有告诉我们的。
  • @AndrejKirejeŭ 发布了更多描述。我正在寻找 SQL 解决方案
  • 在Delphi中我们会这样写:q.SQL.Text = 'SELECT id FROM tbl WHERE id = 9823474'; q.ExecQuery; if q.EOF then Result := 4 else Result := q.Fields[0].AsInteger.
  • @KenWhite RDB$DATABASE 始终只有一行,因此它只是 MS SQL select-without-from 的一种符合 SQL 的方式。在 Oracle 中,通常将其排​​列为 SELECT (expression) FROM SYSTEM.DUAL

标签: firebird


【解决方案1】:

不,例如,这不是唯一的方法

Select first 1 id from (
    Select id FROM tbl WHERE id = 9823474

    Union All

    Select 4 from rdb$database) 

或者你可以使用匿名程序http://firebirdsql.su/doku.php?id=execute_block

 EXECUTE BLOCK RETURNS ( id integer )
 AS
 BEGIN
      IF ( EXISTS (SELECT * FROM tbl WHERE id = 9823474) )
      THEN id = 9823474;
      ELSE id = 4;

      SUSPEND;
 END

...那里总是有很多方法

【讨论】:

  • 我的编辑被拒绝了!! Returning 应该是RETURNS,在Exists 前后加上括号,最后加上suspend;
  • @Wel 是的,与插入返回混合。关于挂起 - 只有 SELECT-from-SP 需要它。但我不确定您是否可以从执行块中进行选择。对于我记得的执行过程(奇异结果),暂停没有给出任何东西。无论如何,我们没有看到你为什么想要它以及你将如何使用它的宏伟蓝图。
  • 我只需要一个解决方案,谢谢。 Suspend; 需要 Returns firebirdfaq.org/faq202
  • @Wel 您的链接以“如果您编写的 SELECT 应该返回一些行”开头。我不会写这样的 for-select 循环。
  • 如果您尝试不使用suspend;,您将得到null。链接显示只是一个例子,它必须是 for..select
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 2015-07-02
  • 2016-07-31
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多