is it possible to have alphanumeric sequence generator in sql

后端 未结 3 1873
谎友^
谎友^ 2020-12-20 20:26

I need to write a SQL query to print the following aphanumberic sequence in SQL

0001, 0002, ... , 0009, 000A, ... , 000Z, ... , 0010, 0011, ... , 001A, ... and s

3条回答
  •  伪装坚强ぢ
    2020-12-20 20:55

    -- To get 00000 to ZZZZZ next auto alphanumeric sequence using this function [Please verify before use]
    -- This starts from 0-9 then A-Z and then increase next digit from 0-9 then A-Z
    -- You need to pass the starting/Last sequence as value to get next sequence  
    CREATE OR REPLACE FUNCTION return_next_seq (curr_sequence VARCHAR2)
    RETURN VARCHAR2 IS
     retval VARCHAR2(4000) := NULL;
     retMaxval VARCHAR2(4000) := NULL;
     eval_digit CHAR(1) := NULL;
     original_sequence VARCHAR2(4000) := curr_sequence;
     curr1_sequence VARCHAR2(4000) := curr_sequence;
    BEGIN
    retval := original_sequence;
    FOR j IN REVERSE 1..LENGTH(curr1_sequence) LOOP -- Using reverse to know
    -- the exact digit position
    eval_digit := SUBSTR(curr1_sequence, LENGTH(curr1_sequence));
    --IF (ASCII(eval_digit) BETWEEN 49 AND 56) OR
    --(ASCII(eval_digit) BETWEEN 97 AND 121) THEN
    IF (ASCII(eval_digit) BETWEEN 48 AND 56) OR
    (ASCII(eval_digit) BETWEEN 65 AND 89) THEN
    eval_digit := CHR(ASCII(eval_digit) +1);
    curr1_sequence := SUBSTR(curr1_sequence,1,LENGTH(curr1_sequence)-1);
    retval := curr1_sequence || eval_digit || SUBSTR(original_sequence,
    LENGTH(curr1_sequence || eval_digit)+1);
    EXIT;
    ELSE -- move to the next digit leaving the evaluated digit untouched.
        IF (ASCII(eval_digit) = 57) THEN
        eval_digit := CHR(ASCII(eval_digit) +8);
        curr1_sequence := SUBSTR(curr1_sequence,1,LENGTH(curr1_sequence)-1);
        retval := curr1_sequence || eval_digit || SUBSTR(original_sequence,
        LENGTH(curr1_sequence || eval_digit)+1);
        EXIT;
        END IF;
        IF (ASCII(eval_digit) = 90) THEN
            retMaxval :=  eval_digit;
            eval_digit := CHR(ASCII(eval_digit) -42);                                          
            curr1_sequence := SUBSTR(curr1_sequence,1,LENGTH(curr1_sequence)-1);
            FOR k IN REVERSE 1..LENGTH(curr1_sequence) LOOP
                IF (ASCII(SUBSTR(curr1_sequence,LENGTH(curr1_sequence))) BETWEEN 48 AND 56) OR (ASCII(SUBSTR(curr1_sequence,LENGTH(curr1_sequence))) BETWEEN 65 AND 89) THEN
                retval := SUBSTR(curr1_sequence,0,LENGTH(curr1_sequence)-1) || CHR(ASCII(SUBSTR(curr1_sequence,LENGTH(curr1_sequence)))+1) || eval_digit || SUBSTR(retval,
                LENGTH(curr1_sequence || eval_digit)+1);
                ELSE
                    IF ASCII(SUBSTR(curr1_sequence,LENGTH(curr1_sequence))) = 57 THEN
                    retval := SUBSTR(curr1_sequence,0,LENGTH(curr1_sequence)-1) || CHR(65) || eval_digit || SUBSTR(retval,
                    LENGTH(curr1_sequence || eval_digit)+1);
                    ELSE
                        IF ASCII(SUBSTR(curr1_sequence,LENGTH(curr1_sequence))) = 90 AND LENGTH(curr1_sequence)>1 THEN
                        retval := SUBSTR(curr1_sequence,0,LENGTH(curr1_sequence)-1) || CHR(48) || eval_digit || SUBSTR(retval,
                        LENGTH(curr1_sequence || eval_digit)+1);
                        curr1_sequence := SUBSTR(curr1_sequence,1,LENGTH(curr1_sequence)-1);
                        retMaxval := retMaxval||'Z';
                        ELSE
                        retMaxval := retMaxval||'Z'; 
                        EXIT;                   
                        END IF;
                    END IF;
                END IF;
            END LOOP;
                EXIT;
        ELSE
            curr1_sequence := SUBSTR(curr1_sequence,1,LENGTH(curr1_sequence)-1);
        END IF;
    END IF;
    END LOOP;
    IF retval IS NULL OR (LENGTH(retval) = LENGTH(retMaxval)) THEN
    RETURN 'MAX';
    END IF;
    RETURN retval;
    END;
    
    -- To verify, call this function like
    SELECT return_next_seq('ZY9Z') FROM dual;
    -- Any improvement suggestion is welcome!
    --- Thanks!..Sanjiv
    

提交回复
热议问题