Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle SQL中,如何仅在列不为null时向列添加文本?_Sql_Oracle_Oracle Sqldeveloper - Fatal编程技术网

在Oracle SQL中,如何仅在列不为null时向列添加文本?

在Oracle SQL中,如何仅在列不为null时向列添加文本?,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我的查询中有这样一列: ROUND(( xyz.DATE - abc.DATE), 5)|| ' days' AS "Average SOD Approval duration" 问题是,当我的数据为空时,我会在每个空框中打印“天”。我希望输出中没有任何内容,如果它为null。只有在有数据时才加上“天”。使用案例陈述: CASE WHEN ROUND((xyz.date - abc.date), 5) IS NOT NULL THEN ROUND((xyz.date

我的查询中有这样一列:

ROUND(( xyz.DATE - abc.DATE), 5)|| ' days' AS "Average SOD Approval duration"
问题是,当我的数据为空时,我会在每个空框中打印“天”。我希望输出中没有任何内容,如果它为null。只有在有数据时才加上“天”。

使用案例陈述:

CASE WHEN ROUND((xyz.date - abc.date), 5) IS NOT NULL 
          THEN ROUND((xyz.date    - abc.date), 5)||' days'
END

您可以添加一个“ELSE NULL”子句,以更加清楚地表明,如果不满足条件,那么如果您希望使case语句特别明确,则将返回NULL,但由于这是默认值,因此没有必要这样做。

使用
case
语句

SELECT CASE WHEN ROUND(( xyz.DATE - abc.DATE), 5) IS NULL 
            THEN NULL 
            ELSE ROUND(( xyz.DATE - abc.DATE), 5)|| ' days'
            END AS "Average SOD Approval duration"
FROM yourtablename

我建议使用
NVL2
而不是
case

SELECT nvl2(ROUND((xyz.DATE - abc.DATE), 5),
            ROUND((xyz.DATE - abc.DATE), 5) || 'days',
            NULL) AS "Average SOD Approval duration"
FROM dual;
以下是较短的方法:

select ltrim(round(d1-d2, 5)|| ' days', ' days') dt from test



编辑:如果至少有一个日期为空,则日期差也为空。在串联“days”之后,您只得到这个字符串作为值,所以从左侧修剪短语“days”会得到null。如果日期不为空,则从左侧修剪不会产生影响。功能文件。在这种情况下,使用修剪可以缩短语法并避免重复计算。

是的,我想说这是最好的答案。我唯一关心的是这个答案是否容易理解它在做什么。有时候,如果有助于将来的维护,最好使用更详细的答案。@Boneist-这个查询是如此的不言自明,以至于我一开始没有任何评论,但通常你是对的,所以我添加了解释。谢谢。是的,它不是世界上最复杂的表达式,但在意识到它只是在非空值中添加“天”之前,您必须首先考虑它,而case/nvl2实现非常清楚您在做什么以及为什么要这样做。注意。我不是说这是OP不应该使用的东西,我只是在风中添加了一个注意事项*{:-)我需要更多的咖啡来真正理解它:P..各种各样的谜题,谢谢你的解释!