Oracle函数以无序方式比较字符串

Man*_*tro 3 sql oracle oracle11g

我需要一个函数来在两个字符串之间进行比较,而不考虑oracle中的顺序.即"asd"和"sad"应视为相等.有类似的功能吗?或者我需要编写自己的函数?

MT0*_*MT0 7

这可以通过一个简单的java函数来完成,以按字母顺序对字符串的字符进行排序:

CREATE AND COMPILE JAVA SOURCE NAMED SORTSTRING AS
public class SortString {
  public static String sort( final String value )
  {
    final char[] chars = value.toCharArray();
    java.util.Arrays.sort( chars );
    return new String( chars );
  }
};
/
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建一个PL/SQL函数来调用:

CREATE FUNCTION SORTSTRING( in_value IN VARCHAR2 ) RETURN VARCHAR2
AS LANGUAGE JAVA NAME 'SortString.sort( java.lang.String ) return java.lang.String';
/
Run Code Online (Sandbox Code Playgroud)

然后,您可以对排序的字符串进行简单的比较:

SELECT CASE
       WHEN SORTSTRING( 'ads' ) = SORTSTRING( 'das' )
       THEN 'Equal'
       ELSE 'Not Equal'
       END
FROM   DUAL;
Run Code Online (Sandbox Code Playgroud)


Lit*_*oot 5

不完全是火箭科学,但是有效(至少在简单的情况下).

它有什么作用?按字母顺序对每个字符串中的字母进行排序并进行比较

SQL> with test (col1, col2) as
  2    (select 'asd', 'sad' from dual),
  3  inter as
  4    (select
  5       col1, regexp_substr(col1, '[^.]', 1, level) c1,
  6       col2, regexp_substr(col2, '[^.]', 1, level) c2
  7     from test
  8     connect by level <= greatest(length(col1), length(col2))
  9    ),
 10  agg as
 11    (select listagg(c1, '') within group (order by c1) col1_new,
 12            listagg(c2, '') within group (order by c2) col2_new
 13     from inter
 14    )
 15  select case when col1_new = col2_new then 'Equal'
 16              else 'Different'
 17         end result
 18  From agg;

RESULT
---------
Equal

SQL> with test (col1, col2) as
  2    (select 'asd', 'sadx' from dual),
<snip>    

RESULT
---------
Different

SQL>
Run Code Online (Sandbox Code Playgroud)