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

如何合并两个字段为一个字段
现有这样的两个字段存在于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_limit
when 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字段