ORACLE的疑问,字段数据为空的时候,检索数据的不同结果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE的疑问,字段数据为空的时候,检索数据的不同结果相关的知识,希望对你有一定的参考价值。
SQL脚本1:select * from table1 where AA <> '中国';
SQL脚本2:select * from table1 where nvl( AA , chr(0) ) <> '中国';
脚本1执行的结果是:AA字段为空(NULL)的都被过滤不显示,等于‘中国’的也不显示;
脚本2执行的结果就正常了,只是过滤了AA为'中国'的记录;
现在请高手解释一下为什么会出现这种情况吧
我要问的的是,脚本1,AA为NULL的情况也是属于 不等于 “中国”这个条件,所以AA为NULL的应该被显示出来,可事实是没有显示,导致NULL不显示的原因是什么?
数据库NULL和""是不一样的,Java中也是啊。
NULL的如果想过滤,必须 AA is NULL;
NVL函数是处理NULL的,要把NULL替换成哪个值。追问
我是想过滤指定的非空值,如果不用NVL处理,结果是指定的非空值与空值都被过滤,与预想不符,所以我想知道为什么空值也被过滤了?
追答NULL是代表直接无,而\'\'呢是代表占了字节,这么说你能懂吗
追问NULL和CHR(0)的区别我懂的,但是我限定的是条件是AA不等于“中国”的都显示出来,但实际是NULL的没有显示,这是为什么?NULL也是不等于"中国",所以应该显示出来的呀
追答select * from table1 where nvl( AA , \'-1\' )\'中国\' 就OK了、
说白了就是要检测null要用is null
不检测null用is not null
比如你的:select * from table1 where AA \'中国\' or AA is null;
晕,你怎么就不明白我的问题呢,你给的这个脚本,和我的脚本2有区别吗?我要问的的是,NULL的情况也是属于 不等于 “中国”这个条件,所以AA为NULL的应该被显示出来,可事实是没有显示,导致NULL不显示的原因是什么?
追答大哥,我真服你了,NULL就是相当于什么都没有,你要人家怎么显示?
就好比,我跟你要糖,你有你可以给我,你没有 怎么给我?除非你有钱去买。
那只是AA为NULL,整条记录还有别的字段不为NULL的,怎么就不能显示出来?NULL是不是不等于"中国"?既然不等于,为什么不显示?
追答你去oracle客服问下吧,所有数据库都是这么规定的,就相当于一个制度了。
追问所有的数据库都这样?虽然不太理解,那以后所有用不等于的条件,都要考虑为NULL的情况了?这样不合理呀
追答我知道的mysql、sql server、oracle跟db2还有sysbase都是这样的。
参考技术A nvl() 参数就是如果字段为空,就用参数2你查查 还有一个nvl2()
望采纳
Java导出excel的程序里去除字段为null的数据,取出不为空的数据
写入excel的时候,加一个if判断,数值的值不为空或者null的时候才写入不就可以了。 参考技术A 用这个方式占用内存比较小,不过不能控制excel格式public class Excel
public static void main(String[] args)
try
String url = "jdbc:oracle:thin:@10.20.1.23:1521:ilisdev";
String username = "uu";
String password = "pp";
Connection conn;
Statement stmt;
ResultSet rs;
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, username, password);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
String sql = "select a.appntname,c.riskname,b.name from lcpol a,ldcom b,lmrisk c "
+ "where a.managecom=b.comcode and a.riskcode = c.riskcode";
rs = stmt.executeQuery(sql);
String path = "c:/test.txt";// 数据存放的位置
Excel excel = new Excel(path, new String[] );
excel.makeXLS(rs, 3);
catch (Exception e)
e.printStackTrace();
private BufferedWriter buff = null;
public Excel(String filePath, String[] titles)
try
if (filePath == null || filePath.equals("") || titles == null
|| titles.length == 0)
System.out.println("路径或标题为空!");
else
buff = new BufferedWriter(new FileWriter(filePath));
for (int i = 0; i < titles.length; i++)
buff.write(titles[i] + "\t");
if (i == (titles.length - 1))
buff.write("\r\n");
catch (Exception e)
e.printStackTrace();
public void makeXLS(ResultSet rs, int colNum)
try
while (rs.next())
for (int i = 1; i <= colNum; i++)
buff.write(rs.getString(i) + "\t");
if (i == colNum)
buff.write("\r\n");
buff.close();
catch (Exception e)
e.printStackTrace();
以上是关于ORACLE的疑问,字段数据为空的时候,检索数据的不同结果的主要内容,如果未能解决你的问题,请参考以下文章