两个varchars之间的比较

Posted

技术标签:

【中文标题】两个varchars之间的比较【英文标题】:Comparison between two varchars 【发布时间】:2018-12-31 17:25:27 【问题描述】:

我需要您的帮助来找到解决方案:

char1 : "1,2,3"
char2 : "1,2,3,4,5" 

并返回以下结果:

char3 : "4,5"

我怎样才能做到这一点?

【问题讨论】:

你的值是有序的吗?是否可以多次具有相同的值?这些值总是数字吗? char1 总是 char2 的子串吗?如果是这样,它总是char2的第一部分吗?双引号是拼写错误还是意味着什么?到目前为止,您尝试过什么? 【参考方案1】:

这样的?

SQL> with test (char1, char2) as
  2    (select '1,2,3', '1,2,3,4,5' from dual),
  3  ch1 as
  4    (select regexp_substr(char1, '[^,]+', 1, level) val
  5     from test
  6     connect by level <= regexp_count(char1, ',') + 1
  7    ),
  8  ch2 as
  9    (select regexp_substr(char2, '[^,]+', 1, level) val
 10     from test
 11     connect by level <= regexp_count(char2, ',') + 1
 12    )
 13  --
 14  select listagg(x.val, ',') within group (order by x.val) result
 15  from
 16  ( (select val from ch1
 17     minus
 18     select val from ch2
 19    )
 20    union
 21    (select val from ch2
 22     minus
 23     select val from ch1
 24    )
 25  ) x;

RESULT
-----------------------------------------------------------------------
4,5

SQL>

【讨论】:

实际上第一个字符串是动态影响的,它可以包含与我为示例固定的值不同的值! 好的,所以 - 你为什么不发布这样的例子? 我认为它会是一样的,但我可能错了。每个字符串的值已经存储在两个变量中,比如说 var1 和 var2 ,所以处理将在 var1 和 var2 上。抱歉,感谢您的帮助【参考方案2】:

还有一个变种:

with t as 
( select 
 '1,2,3' as char1, 
 '1,2,3,4,5' as char2 
from dual )
select listagg(coalesce(a.parsed_char,b.parsed_char),',') within group (order 
by 1) as res
from (  select regexp_substr(char1, '[^,]+',1,level) as parsed_char 
    from t
    connect by regexp_substr(char1, '[^,]+',1,level) is not null ) a
full join 
 (  select regexp_substr(char2, '[^,]+',1,level) as parsed_char 
    from t
    connect by regexp_substr(char2, '[^,]+',1,level) is not null ) b
on (a.parsed_char = b.parsed_char)  
where a.parsed_char is null or b.parsed_char is null;

【讨论】:

以上是关于两个varchars之间的比较的主要内容,如果未能解决你的问题,请参考以下文章

如何搜索两个日期之间的记录。但表日期格式是 varchar

部分比较两个varchar2

Oracle 中 2 个 varchar 列(来自不同表)之间的正则表达式比较

oracle 更新比较 Varchar

Char和Varchar查询速度存储空间比较详解(转)

SQLServer时间比较