查询中的Oracle字符串比较

时间:2017-03-22 12:01:39

标签: sql oracle select

我有两个字符串,想要知道,如果按字母顺序排序列表,string2在string1之前,是相同的,或者在string1之后。

MySql的STRCMP (string1, string2)

是否有某种内置函数,不是那么流行,或者我应该使用非函数方法手动比较每个char(如果这甚至是相当大的)?

提前致谢。

2 个答案:

答案 0 :(得分:1)

是的,它是<。您可以使用布尔比较器来获得&#34;字母&#34;排序。我把它放在引号中因为它取决于字符串的整理,但它通常是合理的。

where条款中:

where string1 < string2

如果你想要一个值,那么这适用于Oracle和MySQL:

select (case when string1 < string2 then 1 else 0 end) as string_compare_flag

答案 1 :(得分:0)

您需要考虑空值和大小写。

在PL / SQL中你可以做这样的事情......

declare 

  BEFORE CONSTANT PLS_INTEGER := -1;
  AFTER CONSTANT PLS_INTEGER := 1;
  SAME CONSTANT PLS_INTEGER := 0;

  NULLS_FIRST CONSTANT VARCHAR2(1) := CHR(9);
  NULLS_LAST CONSTANT VARCHAR2(1) := CHR(127);

  string1 varchar2(100);
  string2 varchar2(100);

  result pls_integer;

  --If this was a function then these would be your input parameters
  inputString1 varchar2(100) := 'A'; --try null here
  inputString2 varchar2(100) := 'b';
  --swap this over if you want nulls first
  nullPos VARCHAR2(1) := NULLS_LAST; --try swapping to NULLS_FIRST

begin

  string1 := upper(nvl(inputString1,nullPos));
  string2 := upper(nvl(inputString2,nullPos));

  result := case when string1 < string2 then BEFORE 
             when string1 = string2 then SAME
             else AFTER end;

  dbms_output.put_line(result);           

end;

为NULLS_FIRST和NULLS_LAST选择的值只是任意但在标准az AZ之外,因此空值将放在非空值之前或之后,因此两个空值将返回0(相同)。 / p>

如果你不关心案件,即A在b之后,那么你可以忽略上面的功能代码。

您可以将plsql代码(或类似代码)放在函数中并从SQL中调用它,或者可以执行

SELECT case when upper(nvl(string1,CHR(127))) < upper(nvl(string2,CHR(127))) then -1
            when upper(nvl(string1,CHR(127))) = upper(nvl(string2,CHR(127))) then 0
            else 1 
            end
...