之前看过老白的一片文章关于数据库中的Null的,
原文如下:
如你所知,EQ sapce 不等效于 IS NULL。
通过SAP创建的表,如果是初次创建,所有的列都会存在一个初始值(MANDT为'000',普通CHAR类型为' ',日期类型为'00000000',数值类型为0。。等等),即Field的NOT NULL为'X',不允许空值。当这个表有了一部分数据后,又更改这个表,添加了一些字段,那么这些新加的字段如果不勾上“Initial Value”就有可能有空值了,也就是NULL值,这样就给SELECT带来很大麻烦。
解决的办法就是勾中“Initial Value”,这样就能够保证字段有初始值了。
今天在群里又有小伙伴提出了相关的问题,做了一些扩充的解释,过程如下
问:
select from dtable 的时候 where条件里面char1类型字段条件 = ‘’和 is null有啥区别吗?
这有个自定义表 条件里写 zdel = '' 和zdel NE 'X'都取不到值 只有zdel is null才取到值
显然根据老白文中提到的勾上初始值选项,是可以的。此处问题是:
关键是勾上和没有勾上究竟产生了什么影响? (体现大牛的时刻呀,哈哈)
给张图、生动一下
红框里的代码注释掉 就能write出结果,保留就sy-subrc = 4,write不出东西。
是NULL的时候 where语句里 就只能和NULL比较?
为啥查不出东西了。 NULL NE 'X'不成立?
看看大顾们给的解释:
but they are converted to initial values of the correct type when passed to data objects.
这句话就说NULL值通过select语句取到数据然后传给程序里的data object的时候,被转换成initial value了。
所以我上面那个代码 在where条件里加ZDEL是NULL值,用 NE 'X'做判断取不到数据 ;
不加那条件,取出来之后ZDEL的值从NULL转成'',用NE 'X',可以输出。
这里跟我们强调了一点,Select语句从DB取出数据到ABAP运行层面是有一层数据对象转换的。这使我想起了SAP的数据层次架构(图略),代码编译转换之间的关系。举例SAP系统语言的存储和显示层不也有着此类的转换吗:中文显示ZH 后台存储实则为 1 。
这里也告诉了我们大顾之所以为大顾是有道理的。
阅读(4290) | 评论(0) | 转发(0) |