PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Konwertuj wartość z reprezentacji ciągu w bazie N na liczbową

Niestety w PostgreSQL nie ma wbudowanej funkcji, ale można ją napisać dość łatwo:

CREATE OR REPLACE FUNCTION number_from_base(num TEXT, base INTEGER)
  RETURNS NUMERIC
  LANGUAGE sql
  IMMUTABLE
  STRICT
AS $function$
SELECT sum(exp * cn)
FROM (
  SELECT base::NUMERIC ^ (row_number() OVER () - 1) exp,
         CASE
           WHEN ch BETWEEN '0' AND '9' THEN ascii(ch) - ascii('0')
           WHEN ch BETWEEN 'a' AND 'z' THEN 10 + ascii(ch) - ascii('a')
         END cn
  FROM regexp_split_to_table(reverse(lower(num)), '') ch(ch)
) sub
$function$;

Uwaga :Użyłem numeric jako typ zwracany, jako int4 w wielu przypadkach nie wystarcza (przy dłuższym wprowadzaniu ciągu znaków).

Edytuj :Oto przykładowa funkcja reverse, która może konwertować bigint do jego reprezentacji tekstowej w ramach niestandardowej bazy:

CREATE OR REPLACE FUNCTION number_to_base(num BIGINT, base INTEGER)
  RETURNS TEXT
  LANGUAGE sql
  IMMUTABLE
  STRICT
AS $function$
WITH RECURSIVE n(i, n, r) AS (
    SELECT -1, num, 0
  UNION ALL
    SELECT i + 1, n / base, (n % base)::INT
    FROM n
    WHERE n > 0
)
SELECT string_agg(ch, '')
FROM (
  SELECT CASE
           WHEN r BETWEEN 0 AND 9 THEN r::TEXT
           WHEN r BETWEEN 10 AND 35 THEN chr(ascii('a') + r - 10)
           ELSE '%'
         END ch
  FROM n
  WHERE i >= 0
  ORDER BY i DESC
) ch
$function$;

Przykładowe użycie:

SELECT number_to_base(1248, 36);

-- +----------------+
-- | number_to_base |
-- +----------------+
-- | yo             |
-- +----------------+



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Specyfikacja prowizji nie przeszła większości testów, ale szyny działają dobrze na źródle Diaspory

  2. Dostrajanie wydajności Postgresql i wykorzystania pamięci w przepływie pracy w Pythonie

  3. Heroku Postgres Połączenie z aplikacji PHP localhost

  4. szyny 3.2.2 (lub 3.2.1) + Postgresql 9.1.3 + Ubuntu 11.10 Błąd połączenia

  5. Proces wykonywania funkcji Postgresql