sql >> Database teknologi >  >> RDS >> Sqlserver

Find ikke-numeriske værdier i en kolonne i SQL Server

Der kan være tilfælde, hvor du skal kontrollere en kolonne for ikke-numeriske værdier. For eksempel opdager du, at en kolonne er en varchar kolonne, når det egentlig burde være en numerisk kolonne.

Dette gøres nemt i SQL Server med ISNUMERIC() funktion.

Eksempel på data

Antag, at vi opretter en tabel med en varchar kolonne, og indsæt data som følger:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
    c1 varchar(255)
);

INSERT INTO t1 (c1) VALUES 
    ('0'),
    ('1'),
    ('+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;

Resultat:

+-----------+
| c1        |
|-----------|
| 0         |
| 1         |
| +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 |
+-----------+

De fleste af ovenstående værdier er numeriske, selvom de er i en varchar kolonne. Følgende eksempler kontrollerer denne kolonne for ikke-numeriske værdier.

ISNUMERIC() Funktion

SELECT c1
FROM t1
WHERE ISNUMERIC(c1) <> 1;

Resultat:

+-----------+
| c1        |
|-----------|
| a         |
| 9afc      |
| e7        |
| +e0       |
| Ten       |
| 5 Dollars |
+-----------+

Her brugte jeg ISNUMERIC() funktion sammen med Ikke lig med (<> ) operatør for at tjekke for værdier, der ikke er numeriske.

Der kan være en god grund til at en kolonne er varchar i stedet for numerisk. Men hvis ikke, skal værdierne konverteres til deres numeriske ækvivalenter, og så skal kolonnens datatype ændres til en numerisk type. Dette vil hjælpe med at bevare databasens dataintegritet.

Find værdier, der ikke indeholder tal

Vi kan bruge følgende forespørgsel til at returnere alle rækker, der ikke indeholder numeriske værdier.

SELECT c1
FROM t1 
WHERE c1 NOT LIKE '%[0-9]%';

Resultat:

+------+
| c1   |
|------|
| a    |
| Ten  |
+------+

Dette er et andet resultat end det foregående eksempel, fordi vi simpelthen leder efter alle værdier, der ikke indeholder eventuelle numeriske data. I det foregående eksempel ledte vi efter de værdier, der ikke er numeriske.


  1. SQL Server 2016:View Designer

  2. Er der en måde at hente autoincrement-id'et fra en forberedt erklæring

  3. Måler du SQL Server-ydeevne med disse metrics?

  4. Forstå Oracle-aliasing - hvorfor genkendes et alias ikke i en forespørgsel, medmindre det er pakket ind i en anden forespørgsel?