sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta icke-numeriska värden i en kolumn i SQL Server

Det kan finnas tillfällen då du behöver kontrollera en kolumn för icke-numeriska värden. Till exempel upptäcker du att en kolumn är en varchar kolumn när det egentligen borde vara en numerisk kolumn.

Detta görs enkelt i SQL Server med ISNUMERIC() funktion.

Exempeldata

Anta att vi skapar en tabell med en varchar kolumn och infoga data enligt följande:

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 flesta av ovanstående värden är numeriska, även om de finns i en varchar kolumn. Följande exempel kontrollerar denna kolumn för icke-numeriska värden.

ISNUMERIC() Funktion

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

Resultat:

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

Här använde jag ISNUMERIC() funktionen tillsammans med Inte lika med (<> ) för att söka efter värden som inte är numeriska.

Det kan finnas en bra anledning till att en kolumn är varchar istället för numerisk. Men om inte, bör värdena konverteras till sina numeriska motsvarigheter, och sedan bör kolumnens datatyp ändras till en numerisk typ. Detta hjälper till att upprätthålla databasens dataintegritet.

Hitta värden som inte innehåller några siffror

Vi kan använda följande fråga för att returnera alla rader som inte innehåller numeriska värden.

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

Resultat:

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

Detta är ett annat resultat än det föregående exemplet, eftersom vi helt enkelt letar efter alla värden som inte innehåller alla numeriska data. I det föregående exemplet letade vi efter de värden som inte är numeriska.


  1. Infoga resultat av en lagrad procedur i en tillfällig tabell

  2. postgresql duplicate key bryter mot unik begränsning

  3. 2 funktioner som returnerar månadens namn från ett datum i MySQL

  4. Är det möjligt att fråga en kommaseparerad kolumn för ett specifikt värde?