Supposons que je souhaite stocker des numéros de téléphone dans une base de données. J'accepte les numéros de téléphone de l'extérieur des États-Unis. Comment pourrais-je stocker ces numéros de téléphone?
libphonenumber
Dans la mesure du possible, utilisez toujours la forme canonique. Plus la forme est normalisée, mieux c'est. S'il existe une norme, utilisez-la. Pour ce problème, utilisons Google libphonenumber , par proxy de pg-libphonenumber .
CREATE EXTENSION pg_libphonenumber;
Cela installe actuellement le phone_number
type qui a des opérateurs de comparaison et des fonctions. Il stocke le nombre sous une forme canonique internationale. C'est le meilleur compromis à mon avis.
parse_phone_number('textnumber', 'CountryCode');
Parce que nous pouvons dire quand les numéros de téléphone sont égaux et que nous fournissons une forme normale interne, nous pouvons le faire.
SELECT parse_phone_number('03 7010 1234', 'AU') = parse_phone_number('(03) 7010 1234', 'AU');
(retourne vrai). Cela signifie également que DISTINCT
fonctionne donc nous pouvons le faire pour obtenir l'effet que vous semblez vouloir ci-dessus.
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
Cela met ..
parse_phone_number
--------------------
+61 3 7010 1234
(1 row)