记oracle数据库查询问题(一)

1.问题描述--利用oracle进行数值与空值之间的运算,今天利用查询出来的SQL结果直接进行算术运算,发现num+空值结果会为空值,可以在查询出来之后,利用oracle数据库的nvl函数,nvl(num,0),意思是说,num为空时,将num的值设为0,这样就不会出现上面的情况了。

2.问题描述--SQL看似正确却查询不出数据,oracle查询时,如果根据where条件进行过滤,后面的字段带有空格,例如 where name = ' 小明 ',注意此时小明这个子段前后是有空格的,这样即使数据库中有小明的字段,但是因为有空格,并不匹配,最后的方式是利用函数trim()函数,上面的SQL语句可以变成 where name = trim(' 小明 '),类似的还有ltrim()和rtrim(),去除左边空格和右边空格

在进行字符串查询时最好trim一下,防止出现类似情况。

3.问题描述--单行子查询返回多行,在oracle中,对某一张表进行updata操作时,一般都会有where条件限制,很可能where的限制条件是一个子查询,示例如下:

记oracle数据库查询问题(一)_第1张图片

可以很清楚的看到示例中PK_VOUCHER是利用 = 进行过滤,而子查询下面是查出来多条数据。这就会导致oracle报错,会提示

单行子查询返回多个行

解决方法如:第一,将where后面的过滤条件由 = 变为 in,这样可以不局限与单行记录。

                     第二,在子查询中加入rownum限制条件,这里我们需要子查询中返回一条记录即可,则可以在子查询中加入rownum<2的条件,这样查出的数据就是一行。

4.问题描述,前台传的值对应oracle数据库的字段存不进去。oracle中varchar2(50),是可以存50个字节,英文占一个字节,而UTF8的编码每个汉字占三个字节;而nvarchar(50)则代表可以存50个字符,也就是说可以存50个汉字,但是英文也只能存50个。varchar2(50 char)和nvarchar(50)一样,也是可以存50个字符,不过,oracle中varchar2()默认的存储方式是字节。

5.问题描述,今天改bug时了解了一个oracle的函数decode(要查询的字段名字,如果字段值为value1,那么就返回value1,如果字段值为value2,那么就返回value2,......,否则返回另外的value);

简写格式为decode(value,if1,then1,if2,then2,if3,then3,...,else)

请看一个示例

DECODE(T.CUSTNAMEDESC, 'null', '', T.CUSTNAMEDESC) AS CUSTNAMEDESC

查询表中CUSTNAMEDESC字段的值,如果为null,返回空,否则返回CUSTNAMEDESC字段的值。

这个函数只有oracle中才有的,特别方便,相当于MySQL中 case value when value1 then value2 .....else value3 end。

你可能感兴趣的:(数据库)