比较SQL中顺序不同的两个不同字符串
我在两个不同的表中有两列,希望比较字符串值。例如:比较SQL中顺序不同的两个不同字符串,sql,oracle,Sql,Oracle,我在两个不同的表中有两列,希望比较字符串值。例如: TABLE1.COLUMNA value = ABC, DEF, XYZ TABLE2.COLUMNB value = ABC, XYZ, DEF 我想在两个字符串不相等时返回结果。在这种情况下,我不关心顺序,我只关心两个值相等。因此,在上面的例子中,两个字符串是相等的 这两个字符串不相等 TABLE1.COLUMNA value = ABC, DEF, XYZ TABLE2.COLUMNB value = ABC, XYZ, LMN 仅供
TABLE1.COLUMNA value = ABC, DEF, XYZ
TABLE2.COLUMNB value = ABC, XYZ, DEF
我想在两个字符串不相等时返回结果。在这种情况下,我不关心顺序,我只关心两个值相等。因此,在上面的例子中,两个字符串是相等的
这两个字符串不相等
TABLE1.COLUMNA value = ABC, DEF, XYZ
TABLE2.COLUMNB value = ABC, XYZ, LMN
仅供参考…我正在将此查询放入只支持SQL查询的工具中
任何帮助都将不胜感激。这是一种可怕的存储列表的方式。但是,Oracle有一种叫做正则表达式的神奇的东西,它将允许您这样做。要对其进行更新,请尝试运行以下命令:
with t as (
select '((a,)|(c,)|(b,)){3}' as pat from dual
)
select pat, (case when regexp_like('a,b,c' ||',', pat) then 1 else 0 end)
from t;
这将返回true-从而得出结论,我们可以对字符串进行bastardize,将其转换为正则表达式,从而在另一个字符串中的元素上获得匹配。为了完全平等,我们希望对两种方法进行比较
下面是一些似乎可以解决您的问题的代码:
with t as (
select 'ABC,DEF,XYZ' as val1, 'ABC,XYZ,DEF' as val2 from dual union all
select 'ABC,DEF,XYZ', 'ABC,XYZ,LMN' from dual
)
select t.*,
(case when regexp_like(val1 || ',', pat2||'{'||val2_len||'}') and
regexp_like(val2 || ',', pat1||'{'||val1_len||'}')
then 1 else 0
end) as comp
from (select t.*,
replace('((' || replace(val1 || ',', ',', ',)|(')||'))', '|())', ')') as pat1,
replace('((' || replace(val2 || ',', ',', ',)|(')||'))', '|())', ')') as pat2,
length(val1) - length(replace(val1, ',', '')) + 1 as val1_len,
length(val2) - length(replace(val2, ',', '')) + 1 as val2_len
from t
) t ;
如果列表中有重复的值,这可能不起作用。但是,我要重复,使用连接表或嵌套表是存储此信息的正确方法。不是字符串编码的列表
使用除沫器将每个字符串拆分为3个短字符串,如“ABC”“DEF”“XYZ”
将这3个短字符串存储在不同的表中。
使用类似
挑选*
从表1中选择*
EXCEPT
SELECT * FROM TABL2)
如果结果为空,则“等于”
使用此函数进行拆分
CREATE FUNCTION [dbo].[fnSplitString]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(splitdata NVARCHAR(MAX)
)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitdata)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
在单个查询中很难做到这一点,这正是您不应该在单个字段中存储逗号分隔值的原因。核心问题是拆分字符串,这本身就够难的了。看,这就是当你用字符串来存储事物列表时发生的事情。SQL对于列表有一个很好的数据结构,它被称为表。Oracle甚至有嵌套的表——永远不会让任何使用数据库的人想到将东西存储在列表中。了解连接表。您可以编写存储过程或函数吗?然后您可以1解析每个列的值2将每个值存储在新的临时表中。将临时表与联接进行比较,以便ABC联接ABC等将给出表之间的任何差异,即分隔值的列。我想我可以编写一个存储过程并调用它。那可能是我最好的选择。谢谢。计算值的校验和并比较结果如何。那可能吗?