Как бы вы сравнили числовые значения c в двухсимвольных столбцах друг с другом в SQL? - PullRequest
1 голос
/ 28 января 2020

У меня есть две колонки, Grade и Percent. Они оба символьные столбцы. Даже если что-то выглядит как число, оно сохраняется как символ.

Они оба имеют либо цифры c (70, 85, 91), либо буквенные оценки (A +, B, C -).

В некоторых случаях столбцы Grade и Percent имеют цифры c Grade (сохраняются как символы), но они различаются. Я хочу идентифицировать эти случаи и пометить их как несоответствующие.

Я пытался CASE WHEN CAST(Grade as int) != CAST(Percent as int)

, и это не удалось, но, надеюсь, это даст вам представление о том, что я пытаюсь сделать .. .

---- отдельный вопрос ---

Кроме того, отдельно, как бы я сделал оператор, который помечает, когда значение содержит символ? Вместо того, чтобы что-то вроде СЛУЧАЯ, КОГДА УРОВЕНЬ (A +, A, A-, B +, B, B -... D +, F), как бы я сделал СЛУЧАЙ, КОГДА УРОВЕНЬ НРАВИТСЯ ... чтобы идентифицировать их?

СПАСИБО ТАКОЕ !!

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Одним из методов будет использование 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' .

В более ранних версиях вы можете проверить, содержат ли строки только di git, затем преобразовать и сравнить:

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

Это предполагает, что оба столбца содержат целые значения (не десятичные) и что нет специального форматирования для обработки, например, ведущих 0 s (которые делают строки разными, а числа эквивалентными).


Чтобы проверить, содержит ли значение какое-либо не-ди git символы, которые вы могли бы сделать:

regexp_like(grade, '[^0-9]')
0 голосов
/ 28 января 2020

Попробуйте это

Select * from test where  regexp_like (grade,’^[^a-zA-Z]*s’) 
and 
regexp_like (percent,’^[^a-zA-Z]*s’) and grade<>percent;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...