दुर्भाग्य से, PostgreSQL में इसके लिए कोई अंतर्निहित फ़ंक्शन नहीं है, लेकिन इसे काफी आसान लिखा जा सकता है:
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$;
नोट :मैंने numeric
. का प्रयोग किया है वापसी प्रकार के रूप में, int4
. के रूप में कई मामलों में (लंबी स्ट्रिंग इनपुट के साथ) पर्याप्त नहीं है।
संपादित करें :यहां एक नमूना रिवर्स फ़ंक्शन है, जो एक bigint
. को रूपांतरित कर सकता है एक कस्टम आधार के भीतर इसके पाठ प्रतिनिधित्व के लिए:
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$;
उदाहरण उपयोग:
SELECT number_to_base(1248, 36);
-- +----------------+
-- | number_to_base |
-- +----------------+
-- | yo |
-- +----------------+