Les exemples PostgreSQL suivants renvoient uniquement les lignes qui ont des valeurs numériques dans une colonne donnée.
Exemple de données
Créons un tableau avec des exemples de données :
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
c1 varchar(255)
);
INSERT INTO t1 (c1) VALUES
('0'),
('1'),
('+1'),
('-1'),
('00.00'),
('73.45'),
('+73.45'),
('-73.45'),
('.246'),
('-.34e7'),
('12.e-3'),
('1.2e+4'),
('a'),
('9afc'),
('e7'),
('+e0'),
('Ten'),
('5 Dollars');
SELECT * FROM t1;
Le tableau est maintenant créé et contient les données suivantes :
c1 ----------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 12.e-3 1.2e+4 a 9afc e7 +e0 Dix 5 DollarsLa colonne est un
varchar(255)
colonne, donc ce n'est pas numérique. Il peut contenir (et contient) des nombres, mais ceux-ci sont stockés sous forme de données de caractères. Il peut également contenir du texte arbitraire (ce qu'il fait).Renvoyer toutes les valeurs numériques
Nous pouvons utiliser la requête suivante pour renvoyer toutes les valeurs numériques du tableau ci-dessus :
SELECT c1 FROM t1 WHERE c1 ~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Résultat :
c1 -------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 1.2e+4Renvoyer des entiers
Si nous ne voulons renvoyer que des entiers, la requête peut être beaucoup plus simple :
SELECT c1 FROM t1 WHERE c1 ~ '^[0-9]+$';
Résultat :
c1 ---- 0 1Contient des données numériques
Si nous voulons trouver des lignes contenant des données numériques (même si elles contiennent également des données non numériques), nous pouvons procéder comme suit :
SELECT c1 FROM t1 WHERE c1 ~ '[0-9]+';
Résultat :
c1 ----------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 12.e-3 1.2e+4 9afc e7 +e0 5 dollarsDans PostgreSQL,
~
est un opérateur sensible à la casse pour faire correspondre l'expression régulière donnée. Pour les correspondances insensibles à la casse, utilisez~*
.Vous pouvez utiliser
!~
pour renvoyer toutes les lignes qui ne correspondent pas à l'expression régulière (et!~*
pour les correspondances insensibles à la casse).Classes de caractères POSIX
Postgres prend également en charge les classes de caractères POSIX. Nous pouvons donc utiliser
[:digit:]
au lieu de[0-9]
si nous préférons.Exemple :
SELECT c1 FROM t1 WHERE c1 ~ '^[[:digit:]]?$';
Résultat :
c1 ---- 0 1