选择多列的大查询没有返回行时如何返回一些预定义的值

Posted

技术标签:

【中文标题】选择多列的大查询没有返回行时如何返回一些预定义的值【英文标题】:How to return some predefined value when no row returned from big query with multiple column is selected 【发布时间】:2021-01-23 12:19:49 【问题描述】:

我的查询选择了多个列,但现在我想在没有返回时返回一些虚拟值。

例如在以下查询中:

SELECT a.abc, b.def, c.ghi
FROM comp a, damp b, champ c, omp d 
WHERE a.id=b.id
      and b.id=c.id
      and c.id= d.id
ORDER BY a.abc desc

如果没有返回行我想显示至少一列具有某些值,有人可以建议我如何实现这一点。 我已经提出了一些建议,但没有一个奏效。任何帮助将不胜感激。

【问题讨论】:

请用 1 个 DBMS 标记您的问题 - 是 mysql 还是 Oracle? 请更具体一点:执行此 SELECT 后“没有返回行”,还是在连接表中找不到行? 让你的应用程序逻辑工作一点。 IE。执行查询检查是否获得行,如果没有再次运行查询dual,返回no rows。您将获得更好的性能,就像您使用not exists 将其委托给数据库查询一样。在SQL 中解决这个问题是可能的,但我将其视为反模式 【参考方案1】:

在 oracle 中你可以这样做:

WITH mybigselect AS
(
SELECT a.abc, b.def, c.ghi
FROM comp a
     JOIN damp b ON a.id = b.id
     JOIN champ c ON b.id = c.id
     JOIN omp d ON c.id = d.id 
ORDER BY a.abc desc  
)
SELECT * FROM mybigselect
UNION ALL
SELECT 'Nothing found', NULL, NULL FROM mybigselect
WHERE NOT EXISTS (SELECT * FROM mybigselect)

注意 1:UNION ALL 中的两行都需要返回相同数据类型的列。在SELECT * FROM mybigselect 的第一列不能返回数字,UNION ALL 后面的查询中“没有找到”

注意 2:使用 ANSI-JOIN 样式语法重写了查询。

【讨论】:

【参考方案2】:

我会推荐:

WITH cte as (
      SELECT a.abc, b.def, c.ghi
      FROM comp do JOIN
           damp d
           ON d.id = co.id JOIN
           champ c
           ON ch.id = d.id
           omp o
           ON o.id = ch.id
     )
SELECT *
FROM cte
UNION ALL
SELECT 'Some value', NULL, NLL
FROM dual
WHERE NOT EXISTS (SELECT 1 FROM cte)
ORDER BY abc DESC;

注意事项:

该值必须与列的类型兼容。因此,如果 abc 不是字符串,则 'Some value' 不合适。您没有提供足够的信息来确定哪一列中应该包含什么值。 ORDER BY 应该在最外层的查询中,而不是 CTE。 从不FROM 子句中使用逗号。 始终使用正确、明确、标准、可读的JOIN语法。 此版本使用有意义的表别名(表名缩写)而不是任意字母。

【讨论】:

以上是关于选择多列的大查询没有返回行时如何返回一些预定义的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 查询从 BigQuery 用户定义函数返回值

在 Oracle SQL 中查询不返回单行时更新

PL/SQL如何在没有返回行时显示自定义文本

PDO 中没有行时返回值

没有返回行时如何在 Ag Grid 中添加占位符?

MySQL:从内联子查询返回多列