Sql 如果没有行,如何返回0
当没有返回行时,如何使查询中的“CLUSTER\u INSTANCES\u VALUE”返回零。 目标\名称、目标\类型将保持不变,即查询中返回的内容Sql 如果没有行,如何返回0,sql,oracle,Sql,Oracle,当没有返回行时,如何使查询中的“CLUSTER\u INSTANCES\u VALUE”返回零。 目标\名称、目标\类型将保持不变,即查询中返回的内容 select TARGET_NAME, TARGET_TYPE,SUBSTR(KEY_VALUE, instr(KEY_VALUE, '.', -1, 1) + 1) as CLUSTER_INSTANCES_VALUE from DBTABLE where METRIC_NAME = 'PARAMETER_VALUES' and VA
select TARGET_NAME, TARGET_TYPE,SUBSTR(KEY_VALUE, instr(KEY_VALUE, '.', -1, 1) + 1) as CLUSTER_INSTANCES_VALUE
from DBTABLE
where METRIC_NAME = 'PARAMETER_VALUES'
and VALUE like 'cluster_database_instances'
and TARGET_NAME like '%ORACLE12%'
请建议。谢谢
样本输出:
如果只需要一行,可以使用聚合。以下内容在所有列中返回
NULL
:
select MAX(TARGET_NAME), MAX(TARGET_TYPE),
MAX(SUBSTR(KEY_VALUE, instr(KEY_VALUE, '.', -1, 1) + 1)) as CLUSTER_INSTANCES_VALUE
from DBTABLE
where METRIC_NAME = 'PARAMETER_VALUES' and
VALUE like 'cluster_database_instances' and
TARGET_NAME like '%ORACLE12%';
可以使用COALESCE()
转换为所需的任何值
如果可能得到多行,则可以使用CTE和union all:
with cte as (
select TARGET_NAME, TARGET_TYPE,
SUBSTR(KEY_VALUE, instr(KEY_VALUE, '.', -1, 1) + 1) as CLUSTER_INSTANCES_VALUE
from DBTABLE
where METRIC_NAME = 'PARAMETER_VALUES' and
VALUE like 'cluster_database_instances' and
TARGET_NAME like '%ORACLE12%'
)
select *
from cte
union all
select '', '', '' -- replace with the values you really want
from dual
where not exists (select 1 from cte);
您将SUBSTR和INSTR应用于一个字段,因此如果该字段为null,您将得到null。如果要将其替换为0,请使用NVL
select TARGET_NAME, TARGET_TYPE,SUBSTR(KEY_VALUE, instr(KEY_VALUE, '.', -1, 1) + 1) 1),0) as CLUSTER_INSTANCES_VALUE
from DBTABLE
where METRIC_NAME = 'PARAMETER_VALUES'
and VALUE like 'cluster_database_instances'
and TARGET_NAME like '%ORACLE12%'
范例
SQL> select substr('A',instr('A',-1,1) ) from dual ;
S
-
A
SQL> select substr(null,instr(null,-1,1) ) from dual ;
S
-
SQL> select nvl(substr(null,instr(null,-1,1) ),0) from dual ;
NVL(SUBSTR(NULL,INSTR(NULL,-1,1)),0)
------------------------------------
0
SQL>
一种方法是使用union all检查是否存在与WHERE子句不匹配的记录,并根据如下集群_实例_值返回0
select TARGET_NAME
,TARGET_TYPE
,SUBSTR(KEY_VALUE, instr(KEY_VALUE, '.', -1, 1) + 1) as CLUSTER_INSTANCES_VALUE
from DBTABLE
where METRIC_NAME = 'PARAMETER_VALUES'
and VALUE like 'cluster_database_instances'
and TARGET_NAME like '%ORACLE12%'
union all
SELECT '' as TARGET_NAME
,'' as TARGET_TYPE
,0
FROM DUAL
WHERE NOT EXISTS (select null
from DBTABLE
where METRIC_NAME = 'PARAMETER_VALUES'
and VALUE like 'cluster_database_instances')
and TARGET_NAME like '%ORACLE12%'
添加一个
union all
,该查询在查询中没有返回任何行时返回所需的默认值:
select
TARGET_NAME,
TARGET_TYPE,
SUBSTR(KEY_VALUE, instr(KEY_VALUE, '.', -1, 1) + 1) as CLUSTER_INSTANCES_VALUE
from DBTABLE
where METRIC_NAME = 'PARAMETER_VALUES'
and VALUE like 'cluster_database_instances'
and TARGET_NAME like '%ORACLE12%'
union all
select null, null, 0
from dual
where not exists (
select *
from DBTABLE
where METRIC_NAME = 'PARAMETER_VALUES'
and VALUE like 'cluster_database_instances'
and TARGET_NAME like '%ORACLE12%'
)
注意:其他改进忽略了以关注手头的任务。请向我们显示“零”情况下您想要的确切输出。如果您没有任何记录,并且您希望根据群集实例值显示0,那么针对目标名称、目标类型所需的值是什么?您提供的示例输出不支持您的问题“如何让下面查询中的‘CLUSTER_INSTANCES_VALUE’返回零?”?向我们展示该零的示例。对于空行的CLUSTER_INSTANCES_值,它如何显示0?@GeorgeJoseph我收到了代码解释中的注释it…--替换为您真正想要的值“是的,我看到了:-)op希望它显示为0@GeorgeJoseph是的,但OP也没有说明其他列应该有什么值……确切地说;这就是为什么在我的回答中,我将0的值与CLUSTER_INSTANCES_的值相对,并将空字符串与其他两列相对