日期:2014-05-17  浏览次数:20947 次

很奇怪的substr的问题,求解~~
源数据是这样
SQL code

select z.shiftcode shiftcode from zz_lens_to_q_summary z 
1    5F
2    5F
3    5F
4    5F
5    5H
6    5H
7    5H
8    5H
9    5H



截取一个字符,但出来的结果为空,无论有没有trim。
SQL code

select substr(z.shiftcode,1,1) shiftcode from zz_lens_to_q_summary z
select substr(trim(z.shiftcode),1,1) shiftcode from zz_lens_to_q_summary z

结果为空,但不像null,因为null底色不一样。



截取两个字符,显示的结果是一个字符。
SQL code

select substr(trim(z.shiftcode),1,2) shiftcode from zz_lens_to_q_summary z

1    5
2    5
3    5
4    5
5    5
6    5
7    5
8    5


截取一个字符,但后面和另一个字符串组合,截取的字符串出来了,但是后面跟着的‘课’字没了。
SQL code

select substr(z.shiftcode,1,1)||'课' shiftcode from zz_lens_to_q_summary z

1    5
2    5
3    5
4    5
5    5
6    5
7    5
8    5
9    5



求解~~请问各位高人这是什么原因导致的?

------解决方案--------------------
按照你说的模拟了。一切正常:
create table temp(str varchar2(20));
select a.*,rowid from temp a;
--手动添加数据

select substr(t.str,1,1) from temp t;结果如下:
1 5
2 5
3 5
4 5
5 5
6 5
7 5
8 5
9 5

select substr(trim(t.str),1,2) s from temp t;结果如下:
5F
5F
5F
5F
5H
5H
5H
5H
5H

select substr(trim(t.str),1,2)||'test' s from temp t;结果如下:
5Ftest
5Ftest
5Ftest
5Ftest
5Htest
5Htest
5Htest
5Htest
5Htest
------解决方案--------------------
是不是前面有空白字符TAB
把你截取到的字符用ascii看下编码值。
------解决方案--------------------
select ascii(z.shiftcode),ascii(5) from zz_lens_to_q_summary z

看看结果如何?估计shiftcode前面有隐藏字符
------解决方案--------------------
会不会是tpye是nvarchar2 了,之前我有遇到过,因为类型写错nvarchar2了,结果查看的数据结果位数就不对,但是查看它的长度或是去空格在查,结果都一样,是不对的,最后原因就是类型问题,只是我还没明白为什么会导致这样的错
------解决方案--------------------
查查是不是有不可见的特殊字符
select '|'||z.shiftcode||'|' as shiftcode from zz_lens_to_q_summary z