我有两个字符串,想要知道,如果按字母顺序排序列表,string2在string1之前,是相同的,或者在string1之后。
MySql的STRCMP (string1, string2)
。
是否有某种内置函数,不是那么流行,或者我应该使用非函数方法手动比较每个char(如果这甚至是相当大的)?
提前致谢。
答案 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
...