在oracle数据库中nvl()是啥函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在oracle数据库中nvl()是啥函数?相关的知识,希望对你有一定的参考价值。

nvl( ) 函数

语法:

NVL(eExpression1, eExpression2);

参数:

eExpression1, eExpression2。

如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2。如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1。

eExpression1 和 eExpression2 可以是任意一种数据类型。如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.。

NVL( string1, replace_with)。

功能:如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值。

引申一下,此NVL的作用与SQLserver 中的 ISNULL( string1, replace_with) 一样。

注意事项:string1和replace_with必须为同一数据类型,除非显式的使用TO_CHAR函数。

例:NVL(TO_CHAR(numeric_column), 'some string') 其中numeric_column代指某个数字类型的值。

例:nvl(yanlei777,0) > 0。

NVL(yanlei777, 0) 的意思是 如果 yanlei777 是NULL, 则取 0值。

通过查询获得某个字段的合计值,如果这个值为null将给出一个预设的默认值。

扩展资料:

nvl函数例子:

select nvl(sum(t.dwxhl),1)

from tb_jhde t。

就表示如果sum(t.dwxhl) = NULL 就返回 1。

另一个有关的有用方法。

declare i integer。

select nvl(sum(t.dwxhl),1) into i from tb_jhde t where zydm=-1这样就可以把获得的合计值存储到变量。i中,如果查询的值为null就把它的值设置为默认的1。

oracle中:

select nvl(rulescore,0) from zwjc_graderule where rulecode='FWTD';

如果记录中不存在rulecode ='FWTD'的数据.则查不出数据。

select nvl(rulescore,0) into rule_score from zwjc_graderule where rulecode='FWTD';会报查不到数据的错。

select nvl(sum(rulescore),0) from zwjc_graderule where rulecode='FWTD';

如果记录中不存在rulecode ='FWTD'的数据.还是可以得到一行列名为nvl(rulescore,0),值为0的数据。

select nvl(sum(rulescore),0) rule_score from zwjc_graderule where rulecode='FWTD'; 不会报错。



参考技术A

NVL(exp1,exp2),如果exp1的计算结果为null值,则NVL()返回exp2。如果exp1的计算结果不是null值,则返回exp1。

使用样例如下:

1、创建测试表,

create table test_nvl(value varchar2(50));

2、插入测试数据

insert into test_nvl values('123');

insert into test_nvl values('456');

insert into test_nvl values('');

insert into test_nvl values('666');

insert into test_nvl values('111');

commit;

3、查询表中全量数据,select t.*, rowid from test_nvl t;

4、编写sql,使用nvl函数,可以发现空值转为了1; select t.*, nvl(value,1) value2 from test_nvl t;

参考技术B 空值null转换函数,例如:
select nvl(null,'A') from dual
结果就是字符 A

select nvl(null,100) from dual
结果就是数值 100
参考技术C 如果你某个字段为空,但是你想让这个字段显示0
nvl(字段名,0),就是当你选出来的时候,这个字段虽然为空,但是显示的是0,当然这个0也可以换成其他东西,如:1,2,3……本回答被提问者采纳
参考技术D 如果你某个字段为空,但是你想让这个字段显示0
nvl(字段名,0),就是当你选出来的时候,这个字段虽然为空,但是显示的是0,当然这个0也可以换成其他东西,如:1,2,3……

如何在spring数据仓库nativeQuery中使用oracle NVL函数

【中文标题】如何在spring数据仓库nativeQuery中使用oracle NVL函数【英文标题】:How to use oracle NVL function in spring data repository nativeQuery 【发布时间】:2017-11-06 15:56:53 【问题描述】:

我正在尝试在 Spring Data Repository 的 nativeQuery 中使用 oracle 的 NVL 函数。

当我在programId 参数中传递null 值时,它会抛出异常(ORA-00932: inconsistent datatypes: expected NUMBER got BINARY),如果我在“programId”中传递一个有效值,那么它工作正常。

public interface ProgramRulesRepository

  public static final String FIND_PROGRAM_RULES_BY_PARTICIPANT_ID_AND_ROLE_OR_PROGRAM = " SELECT DISTINCT pr.id , pr.program_id , prgm.display_name , pr.group_id , pr.type , pr.cmmo_key FROM  program prgm , program_rule pr , program_audience pa , participant_audience paa WHERE prgm.id = pa.program_id AND pr.program_id = pa.program_id AND pa.audience_id = paa.audience_id AND pr.type = :roleType  AND paa.participant_id = :participantId "
      + " AND pr.program_id = NVL ( :programId ,pr.program_id )";

  @Query( value = FIND_PROGRAM_RULES_BY_PARTICIPANT_ID_AND_ROLE_OR_PROGRAM, nativeQuery = true )
List<Object[]> findByParticipantIdAndRoleTypeOrProgramId( @Param( "participantId" ) Long participantId, @Param( "roleType" ) String roleType, @Param( "programId" ) Long programId );



例外:

Caused by: java.sql.SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected NUMBER got BINARY

【问题讨论】:

Spring Data - ignore parameter if it has a null value的可能重复 【参考方案1】:

我在使用 MongoDB 时遇到过这个问题。但是我可以通过使用 mongoTemplate 来解决这个问题,

 Query query = new Query();
 Criteria criteria = new Criteria();
 List<Criteria> orCriterias = new ArrayList<>();
 if( dto.getId() != null)     
   orCriterias.add(Criteria.where("id").is(Integer.parseInt(dto.getId())));
 
 ... so on for other fields
criteria.orOperator(orCriterias.toArray(new Criteria[orCriterias.size()]));
query.addCriteria(criteria);
List<StudentDTO> recordsList = mongoTemplate.find(query, StudentDTO.class, 
"student_collection");

【讨论】:

我通过应用条件忽略空参数并将条件添加到条件列表。然后将“orOperators”、“andOperators”等运算符应用为文档docs.spring.io/spring-data/mongodb/docs/2.0.8.RELEASE/reference/…。然后将该条件列表添加到 Query。 这个东西也在spring jira“jira.spring.io/browse/DATAJPA-209”中讨论。请也参考它以获得想法。【参考方案2】:

在使用 Hibernate 时避免使用 NVL 和 COALESCE。 COALESCE 函数需要具有相同类型的所有参数。 NVL 使用隐式转换,当存在 BINARY 或 VARBINARY 时效果不佳。这个 BINARY 是从哪里来的?好吧,Hibernate 将 NULL 值设置为 BINARY 类型并忽略 Java 支持的真实数据类型。当您将日志记录级别设置为跟踪时,您可以在输出中看到:

binding parameter [1] as [VARBINARY] - [null]

因此,当 COALESCE 或 NVL 函数中的其他类型为例如 NUMBER 时,您将收到错误 ORA-00932。

【讨论】:

【参考方案3】:

这个问题的一个很好的解决方案是:

" AND (:programId IS NULL OR pr.program_id = :programId)"

这样做,如果你的参数为空,这句话将返回TRUE,不会丢弃寄存器,如果不为空,将与存储在其字段中的值进行比较。

【讨论】:

以上是关于在oracle数据库中nvl()是啥函数?的主要内容,如果未能解决你的问题,请参考以下文章

oracle的nvl和nvl2是啥函数,两者区别是啥呢

oracle的nvl和nvl2是啥函数,两者区别是啥呢

Oracle中nvl函数的用法和作用是啥?

数据库sql语句length(NVL(RZSJ,''))是啥意思?

SQL中,使用NVL函数,报错:ora-01722:无效数字

oracle中nvl()函数有啥用啊?