我有两列,等级和百分比。它们都是字符列。即使某些东西看起来像数字,它也会存储为字符。
它们都具有数字等级(70、85、91)和字母等级(A +,B,C-)。
在某些情况下,“成绩”和“百分比”列具有数字成绩(存储为字符),但它们是不同的。我想识别这些情况并将其标记为不匹配。
我尝试过CASE WHEN CAST(Grade as int) != CAST(Percent as int)
并且失败了,但希望它能使您对我正在尝试做的事情有感觉...
----单独的问题---
[另外,我将如何单独声明一个值包含字符的语句?代替类似“当输入时为案例(A +,A,A-,B +,B,B -... D +,F)”之类的方法,我将如何像“当输入时发现案例”来识别这些?
非常感谢!
一种方法是将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]')
尝试一下
Select * from test where regexp_like (grade,’^[^a-zA-Z]*s’)
and
regexp_like (percent,’^[^a-zA-Z]*s’) and grade<>percent;