Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较SQL中顺序不同的两个不同字符串_Sql_Oracle - Fatal编程技术网

比较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等将给出表之间的任何差异,即分隔值的列。我想我可以编写一个存储过程并调用它。那可能是我最好的选择。谢谢。计算值的校验和并比较结果如何。那可能吗?