现有这样的两个字段存在于ml表中
min_limit max_limit
<5
>10
2 18
9
10
<=30
现在要把这两个字段整合成一个字段limit
limit
<5
>10
2~18
9
10
<=30
我用的方法是(oracle中):
select (case when ml.min_limit is null and ml.max_limit is not null then ml.max_limit
when ml.min_limit is not null and ml.max_limit is null then ml.min_limit
when ml.min_limit is null and ml.max_limit is null then null
when ml.min_limit is not null and ml.max_limit is not null then ml.min_limit||'~'||ml.max_limit end) as limit
from mlp_com ml
但出来的结果却是
limit
<5~
~>10
2~18
9~
~10
~
<=30~
分析的原因大概是因为ml表中的那些空的数据,不算是null,所以一直执行的都是两个不为null的,都在中间加~。
那这个问题要如何解决啊?
求教各位大大啊!!!
------解决方案--------------------
只有满足 when TRIM(ml.min_limit) is not null and TRIM(ml.max_limit) is not null 时候中间才加上'~ '来合并,
其他种情况一律直接合并两个字段就OK!
- SQL code
select (case when TRIM(ml.min_limit) is null or TRIM(ml.max_limit) is not null ml.min_limit ¦ ¦ ml.max_limitwhen TRIM(ml.min_limit) is not null and TRIM(ml.max_limit) is not null then ml.min_limit ¦ ¦ '~ ' ¦ ¦ ml.max_limit end) as limit from mlp_com ml
------解决方案--------------------
不是的,instr(str1, str2,num)=0在str1字符串中可能有很多个str2(在你的表里就只有一个‘<’了),数字num的意思是str2出现在str1中出现第num次的位置,如:instr( 'asdfasdf ', 's ',2) 是s在'asdfasdf'里出现第二次的位置,结果为6.所以我写的是1,instr(ml.max_limit, ' < ',1)=0是说‘<’在ml.max_limit里出现第一次的位置,如果为0,则用‘~’号链接两边的值作为limit字段