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

在SQL中,如何比较两个字符列中的数值?,sql,oracle,Sql,Oracle,我有两列,分数和百分比。它们都是字符列。即使某些东西看起来像一个数字,它也被存储为字符 它们都有数字等级70、85、91和字母等级A+、B、C- 在某些情况下,“等级”和“百分比”列将数字等级存储为字符,但它们是不同的。我想识别这些案例并将其标记为不匹配 我试过了 CASTGrade为int时的情况!=以整数表示的百分比 虽然失败了,但希望它能让你明白我想做什么 --单独问题-- 另外,单独来说,当一个值包含一个字符时,我如何做一个标记语句?当等级为A+,A,A-,B+,B,B-…D+,F时,我

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

它们都有数字等级70、85、91和字母等级A+、B、C-

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

我试过了 CASTGrade为int时的情况!=以整数表示的百分比

虽然失败了,但希望它能让你明白我想做什么

--单独问题--

另外,单独来说,当一个值包含一个字符时,我如何做一个标记语句?当等级为A+,A,A-,B+,B,B-…D+,F时,我将如何处理等级为。。要识别这些


非常感谢你

一种方法是使用Oracle 12.2提供的转换错误时默认为NULL的数字:

CASE WHEN 
    TO_NUMBER(grade DEFAULT NULL ON CONVERSION ERROR) 
    <> TO_NUMBER(percent DEFAULT NULL ON CONVERSION ERROR)
THEN 'mismatch' END
这假设两个列都包含整数值而不是小数,并且没有特殊的格式化需要处理,比如前导0,这使得字符串不同,而数字是相等的

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

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

Select * from test where  regexp_like (grade,’^[^a-zA-Z]*s’) 
and 
regexp_like (percent,’^[^a-zA-Z]*s’) and grade<>percent;

纠正数据模型,问题就会消失。字母等级根本不应该被存储,因为它应该总是在运行时从pct中派生出来。grade_pct应该是一个数字,而不是一个字符串。类似regexp_的部分用于字符值,但当您提供的代码:ORA-06550:line 13,column 39:ORA-00907:missing right时,我遇到了这个错误parenthesis@ESIRMITS:您正在运行哪个Oracle版本?这需要12.2,正如我在回答中所解释的。哦,哎呀。。。现在是12点。1@ESIRMITS:我用早期版本的解决方案更新了我的答案。谢谢,这很好。:
Select * from test where  regexp_like (grade,’^[^a-zA-Z]*s’) 
and 
regexp_like (percent,’^[^a-zA-Z]*s’) and grade<>percent;