PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Renvoyer uniquement les valeurs numériques d'une colonne de base de données PostgreSQL

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 Dollars 

La 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+4

Renvoyer 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 1

Contient 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 dollars

Dans 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