Как я могу проверить это в запросе SQL? - PullRequest
0 голосов
/ 25 октября 2019

Я изучаю язык SQL Query. Моя задача - сравнить номера идентификаторов в локальной переменной. Я пытаюсь написать скрипт проверки ID_number, который содержит if-es. У меня есть проверка персонажа и проверка длины. Условия:

 - 2 letter + space + 6 numbers, pl.: AE 232323 then it is okay.
 - 2 letter + dash + Roman Number + space + 6 Numbers, pl.: AU-I 123456 not valid
 - 6 numbers + 2 letters, pl.: 123456AA

У меня есть такие:

SET SERVEROUTPUT ON;
DECLARE
  p_idn students.id_number%TYPE;
  v_idn_check_result INT;

BEGIN
  DBMS_OUTPUT.PUT('Length based testing: ');
  p_idn := 'me234158';
  v_idn_check_result := check_idn(p_idn);
  IF v_idn_check_result = 0 THEN
    DBMS_OUTPUT.PUT_LINE('Okay');
  ELSE
    DBMS_OUTPUT.PUT_LINE('ERROR');
  END IF;
DBMS_OUTPUT.PUT('Character based testing ');
  p_idn := '01201201x';
  v_idn_check_result := sf_check_idn(p_idn);
  IF v_idn_check_result = 0 THEN
    DBMS_OUTPUT.PUT_LINE('OKAY');
  ELSE
    DBMS_OUTPUT.PUT_LINE('ERROR');
  END IF;
END;

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Вы можете проверить каждый шаблон с помощью регулярного выражения. Но, пожалуйста, объясните, почему вы говорите «AU-I 123456», поскольку оно точно соответствует вашему заявленному требованию:2 буквы + тире + римские цифры + пробел + 6 цифр

  • 'AU' -> 2 буквы
  • '-' -> тире
  • 'I' -> Римская цифра 1
  • '' -> пробел
  • '123456' -> 6 цифр

Ниже приведено регулярное выражение, используемое для каждого требования.

  • 2 буквы + пробел + 6 цифр, пл .: AE 232323, тогда все в порядке. регулярное выражение: ^ [AZ] {2} \ d {6} $

  • 2 буквы + тире + римское число + пробел + 6 номеров, pl: AU-I 123456 недопустимо регулярное выражение: ^ [AZ] {2} - [IVXLCMivxlcm] + \ d {6} $

  • 6 цифр + 2 буквы, pl .: 123456AA регулярное выражение: ^ \ d {6} [AZ] {2} $

И запросы:Без RegExp для римских цифр

with test_set as
     ( select 'AE 232323'  stg from dual union all 
       select 'AU-I 123456'    from dual union all    
       select '123456AA'       from dual
     )
select stg,case when regexp_like(stg, '(^[A-Z]{2} \d{6}$|^\d{6}[A-Z]{2}$)') then 'Good' else 'Invalid' end  id_ok 
  from test_set;

И с RegExp для римских цифр

with test_set as
     ( select 'AE 232323'  stg from dual union all 
       select 'AU-I 123456'    from dual union all    
       select '123456AA'       from dual
     )
select stg,case when regexp_like(stg, '(^[A-Z]{2} \d{6}$|^\d{6}[A-Z]{2}$)|^[A-Z]{2}-[IVXLCMivxlcm]+ \d{6}$') then 'Good' else 'Invalid' end  id_ok 
  from test_set;
0 голосов
/ 29 октября 2019

Вам необходимо создать функции, удовлетворяющие вашему условию. В качестве примера делюсь решением для case1. В другом случае 2 вы можете построить function на аналогичных строках.

DECLARE
    p_idn                VARCHAR2(10);
    v_idn_check_result   INT;
---Function to handle first case

    FUNCTION check_idn (
        p_idn VARCHAR2
    ) RETURN NUMBER IS
        var1   NUMBER;
        var2   NUMBER;
        var3   NUMBER;
    BEGIN
        var1   := ascii(substr(p_idn, 1, 1) );
        var2   := ascii(substr(p_idn, 2, 1) );
        var3   := substr(p_idn, 3);

        IF   --Checking if first character is a alphabet
            ( var1 BETWEEN 65 AND 90 ) OR ( var1 BETWEEN 97 AND 122 )
        THEN
            IF   --Checking if second character is a alphabet
                ( var2 BETWEEN 65 AND 90 ) OR ( var2 BETWEEN 97 AND 122 )
            THEN
                IF --Checking if length is 6 character
                    length(var3) = 6
                THEN --Checking if last 6 character are number
                    var3   := to_number(var3);
                ELSE
                    RETURN 1;
                END IF;

                RETURN 0;
            ELSE
                RETURN 1;
            END IF;
        ELSE
            RETURN 1;
        END IF;

    EXCEPTION
        WHEN value_error THEN
            dbms_output.put_line('Value Error -->'
            || sqlerrm);
            RETURN 1;
        WHEN OTHERS THEN
            dbms_output.put_line('Error -->'
            || sqlerrm);
            RETURN 1;
    END;

BEGIN
    dbms_output.put('Length based testing: ');
    p_idn                := '&input';
    v_idn_check_result   := check_idn(p_idn);
    IF
        v_idn_check_result = 0
    THEN
        dbms_output.put_line('Okay');
    ELSE
        dbms_output.put_line('ERROR');
    END IF;

END;

Обратите внимание, что после его выполнения вам будет предложено ввести строку. Вам необходимо ввести строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...