PostgreSQL Генерация Alphanumeri c ID из целых чисел - PullRequest
1 голос
/ 27 апреля 2020

Я хочу использовать это: { ссылка }

Или что-то похожее на создание строки alphanumeri c из отметки времени UNIX.

CREATE OR REPLACE FUNCTION consistent_shuffle(alphabet TEXT, salt TEXT) RETURNS TEXT AS $$
DECLARE
    SALT_LENGTH INT := length(salt);
    integer INT = 0;
    temp TEXT = '';
    j INT = 0;
    v INT := 0;
    p INT := 0;
    i INT := length(alphabet) - 1;
    output TEXT := alphabet;
BEGIN
    IF salt IS NULL OR length(LTRIM(RTRIM(salt))) = 0 THEN
        RETURN alphabet;
    END IF;
    WHILE i > 0 LOOP
        v := v % SALT_LENGTH;
        integer := ASCII(substr(salt, v + 1, 1));
        p := p + integer;
        j := (integer + v + p) % i;

        temp := substr(output, j + 1, 1);
        output := substr(output, 1, j) || substr(output, i + 1, 1) || substr(output, j + 2);
        output := substr(output, 1, i) || temp || substr(output, i + 2);

        i := i - 1;
        v := v + 1;
    END LOOP;
    RETURN output;
END;
$$ LANGUAGE plpgsql VOLATILE;

CREATE OR REPLACE FUNCTION generate_uid(id INT, min_length INT, salt TEXT) RETURNS TEXT AS $$
DECLARE
    clean_alphabet TEXT := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
    curse_chars TEXT := 'csfhuit';
    curse TEXT := curse_chars || UPPER(curse_chars);
    alphabet TEXT := regexp_replace(clean_alphabet, '[' || curse  || ']', '', 'gi');
    shuffle_alphabet TEXT := consistent_shuffle(alphabet, salt);
    char_length INT := length(alphabet);
    output TEXT := '';
BEGIN
    WHILE id != 0 LOOP
        output := output || substr(shuffle_alphabet, (id % char_length) + 1, 1);
        id := trunc(id / char_length);
    END LOOP;
    curse := consistent_shuffle(curse, output || salt);
    output := RPAD(output, min_length, curse);
    RETURN output;
END;
$$ LANGUAGE plpgsql VOLATILE;

Однако я получаю следующую ошибку:

SELECT generate_uid(ceil(extract(epoch from now())*100000), 8, '20');

[42883] ОШИБКА: функция substr (text, bigint, integer) не существует Подсказка: ни одна функция не соответствует заданному типы имени и аргумента. Возможно, вам придется добавить явные приведения типов. Где: PL / pg SQL функция demo_generate_uid (bigint, integer, text) строка 12 при назначении

Я пытался изменить id INT на BIGINT. Но это не исправляет ошибку.

1 Ответ

0 голосов
/ 27 апреля 2020

1) Измените int на BigInt

CREATE OR REPLACE FUNCTION public.generate_uid(
    id BigInt,
    min_length integer,
    salt text)
...

2) Измените эту строку:

output := output || substr(shuffle_alphabet, (id % char_length) + 1, 1);

на:

 output := output || substr(shuffle_alphabet::text, ((id % char_length) + 1)::int, 1);

3) А потом:

SELECT generate_uid(ceil(extract(epoch from now())*100000)::bigint, 8, '20');

возврат:

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