Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zwracaj tylko wartości liczbowe w MySQL

Poniższe zapytanie MySQL zwraca tylko te wiersze, które mają wartości liczbowe w danej kolumnie.

Przykładowe dane

Załóżmy, że tworzymy taką tabelę:

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;

Tabela została utworzona i zawiera następujące dane:

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

Kolumna to varchar(255) kolumna, więc nie jest liczbowa. Może (i zawiera) liczby, ale są one przechowywane jako dane znakowe. Może również zawierać dowolny tekst (co robi).

Zwróć wszystkie wartości liczbowe

Możemy użyć następującego zapytania, aby zwrócić wszystkie wartości liczbowe z powyższej tabeli:

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

Wynik:

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

Tutaj użyliśmy REGEXP funkcja, aby dopasować tylko te wartości, które pasują do naszego określonego wzorca.

Zwracane liczby całkowite

Jeśli chcemy zwrócić tylko liczby całkowite, wzorzec może być dużo prostszy:

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

Wynik:

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

Zawiera dane liczbowe

Jeśli chcemy znaleźć wiersze, które tylko zawierają dane numeryczne (nawet jeśli zawierają również dane nienumeryczne), możemy wykonać następujące czynności:

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

Wynik:

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

Klasy znaków POSIX

MySQL obsługuje klasy znaków POSIX, co oznacza, że ​​możemy użyć [:digit:] zamiast [0-9] w naszych wyrażeniach regularnych.

Przykład:

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

Co jest odpowiednikiem następującego:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uwzględnić nagłówki podczas korzystania z funkcji SELECT INTO OUTFILE?

  2. PDO mysql:Jak sprawdzić, czy wstawienie się powiodło?

  3. jak sprawdzić i ustawić zmienną max_allowed_packet mysql

  4. Jak uzyskać rekord z maksymalną wartością w MySQL?

  5. Funkcje agregujące MySQL bez klauzuli GROUP BY