Припустимо, я хочу зберігати телефонні номери в базі даних. Я можу приймати номери телефонів з-за меж США. Як би я міг зберігати ці номери телефонів?
Припустимо, я хочу зберігати телефонні номери в базі даних. Я можу приймати номери телефонів з-за меж США. Як би я міг зберігати ці номери телефонів?
Відповіді:
libphonenumber
По можливості завжди використовуйте канонічну форму. Чим більше нормалізована форма, тим краще. Якщо є стандарт, використовуйте його. Для цієї проблеми скористаємося libphonenumber від Google за допомогою проксі-сервера pg-libphonenumber .
CREATE EXTENSION pg_libphonenumber;
В даний час встановлюється phone_number
тип, який має оператори порівняння та функції. Він зберігає номер у міжнародній канонічній формі. Це найкращий компроміс на мій погляд.
parse_phone_number('textnumber', 'CountryCode');
Оскільки ми можемо сказати, коли номери телефонів рівні між собою, і ми надаємо внутрішню нормальну форму, ми можемо це зробити.
SELECT parse_phone_number('03 7010 1234', 'AU') = parse_phone_number('(03) 7010 1234', 'AU');
(повертає правду). Це також означає, що це DISTINCT
працює, тому ми можемо це зробити, щоб отримати ефект, який, здається, ви хочете вище.
CREATE TABLE foo
AS
SELECT DISTINCT parse_phone_number(ph, 'AU')
FROM ( VALUES
('0370101234'),
('03 7010 1234'),
('(03) 7010 1234')
) AS t(ph);
SELECT 1
Це ставить у ..
parse_phone_number
--------------------
+61 3 7010 1234
(1 row)