PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chuyển đổi giá trị từ biểu diễn chuỗi trong cơ số N sang số

Thật không may, không có chức năng tích hợp nào cho điều đó trong PostgreSQL, nhưng có thể được viết khá dễ dàng:

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$;

Lưu ý :Tôi đã sử dụng numeric dưới dạng kiểu trả về, dưới dạng int4 trong nhiều trường hợp là không đủ (với đầu vào chuỗi dài hơn).

Chỉnh sửa :Đây là một hàm đảo ngược mẫu, có thể chuyển đổi một bigint biểu diễn văn bản của nó trong một cơ sở tùy chỉnh:

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$;

Cách sử dụng ví dụ:

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. Không thể tổng hợp các mảng

  2. Postgres, Truy vấn đơn giản không sử dụng chỉ mục

  3. Tạo chuỗi ngẫu nhiên duy nhất trong plpgsql

  4. Làm mới các chế độ xem cụ thể hóa:Đồng tiền, hành vi giao dịch

  5. Chọn các hàng được sắp xếp theo một số cột và phân biệt trên một cột khác