sql >> Database teknologi >  >> RDS >> Mysql

Returner kun numeriske værdier i MySQL

Følgende MySQL-forespørgsel returnerer kun de rækker, der har numeriske værdier i en given kolonne.

Eksempel på data

Antag, at vi opretter en tabel som denne:

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;

Tabellen er nu oprettet og indeholder følgende data:

+-----------+
| 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       |
| Ten       |
| 5 Dollars |
+-----------+

Kolonnen er en varchar(255) kolonne, så den er ikke numerisk. Det kan (og gør) indeholde tal, men disse gemmes som tegndata. Den kan også indeholde vilkårlig tekst (hvilket den gør).

Returner alle numeriske værdier

Vi kan bruge følgende forespørgsel til at returnere alle numeriske værdier fra ovenstående tabel:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Resultat:

+--------+
| c1     |
+--------+
| 0      |
| 1      |
| +1     |
| -1     |
| 00.00  |
| 73.45  |
| +73.45 |
| -73.45 |
| .246   |
| -.34e7 |
| 1.2e+4 |
| e7     |
| +e0    |
+--------+

Her brugte vi REGEXP funktion til kun at matche de værdier, der matcher vores specificerede mønster.

Returner heltal

Hvis vi kun ønsker at returnere heltal, kan mønsteret være meget enklere:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[0-9]+$';

Resultat:

+------+
| c1   |
+------+
| 0    |
| 1    |
+------+

Indeholder numeriske data

Hvis vi ønsker at finde rækker, der kun indeholder numeriske data (selvom de også indeholder ikke-numeriske data), kan vi gøre følgende:

SELECT c1 
FROM t1 
WHERE c1 REGEXP '[0-9]+';

Resultat:

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

POSIX-karakterklasser

MySQL understøtter POSIX-tegnklasser, hvilket betyder, at vi kan bruge [:digit:] i stedet for [0-9] i vores regulære udtryk.

Eksempel:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[[:digit:]]?$';

Hvilket svarer til følgende:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[0-9]?$';

  1. Konfiguration af en lytter i Oracle Database (12c, 18c og 19c udgaver)

  2. Saml en enkelt kolonne i forespørgslen med mange kolonner

  3. Bedste DBaaS-løsning til MySQL

  4. Kan jeg i en Oracle-trigger tildele ny og gammel til en rækketypevariabel?