如何在SQL中将两个字符列中的数值相互比较?

问题描述 投票:1回答:2

我有两列,等级和百分比。它们都是字符列。即使某些东西看起来像数字,它也会存储为字符。

它们都具有数字等级(70、85、91)和字母等级(A +,B,C-)。

在某些情况下,“成绩”和“百分比”列具有数字成绩(存储为字符),但它们是不同的。我想识别这些情况并将其标记为不匹配。

我尝试过CASE WHEN CAST(Grade as int) != CAST(Percent as int)

并且失败了,但希望它能使您对我正在尝试做的事情有感觉...

----单独的问题---

[另外,我将如何单独声明一个值包含字符的语句?代替类似“当输入时为案例(A +,A,A-,B +,B,B -... D +,F)”之类的方法,我将如何像“当输入时发现案例”来识别这些?

非常感谢!

sql oracle
2个回答
2
投票

一种方法是将TO_NUMBER()DEFAULT NULL ON CONVERSION ERROR一起使用(可从Oracle 12.2获得:

CASE WHEN 
    TO_NUMBER(grade DEFAULT NULL ON CONVERSION ERROR) 
    <> TO_NUMBER(percent DEFAULT NULL ON CONVERSION ERROR)
THEN 'mismatch' END

如果转换之一失败,则TO_NUMBER()返回NULL;与NULL相同(也不相等),因此条件没有得到满足。

另一方面,如果两次转换均失败,则比较结果值;如果它们不匹配,则返回'mismatch'

在早期版本中,您可以检查字符串是否仅包含数字,然后进行转换和比较:

CASE WHEN
    REGEXP_LIKE(grade, '^[0-9]+$')
    AND REGEXP_LIKE(percent, '^[0-9]+$')
    AND grade <> percent
THEN 'mismatch' END

[这假设两列都包含整数值(非小数),并且没有特殊的格式可处理,例如前导0(当数字相等时字符串会有所不同)。


要检查值是否包含任何非数字字符,可以执行以下操作:

regexp_like(grade, '[^0-9]')

0
投票

尝试一下

Select * from test where  regexp_like (grade,’^[^a-zA-Z]*s’) 
and 
regexp_like (percent,’^[^a-zA-Z]*s’) and grade<>percent;
© www.soinside.com 2019 - 2024. All rights reserved.