it-swarm-eu.dev

Wie überprüfe ich, ob ein Wert in MySQL eine Ganzzahl ist?

Ich sehe, dass es in MySQL Cast() und Convert() Funktionen gibt, um Ganzzahlen aus Werten zu erstellen, aber gibt es eine Möglichkeit zu überprüfen, ob ein Wert eine Ganzzahl ist? Etwas wie is_int() in PHP ist das, wonach ich suche.

107
Craig Nakamoto

Ich gehe davon aus, dass Sie einen Zeichenfolgenwert überprüfen möchten. Eine gute Möglichkeit ist der REGEXP-Operator, der die Zeichenfolge einem regulären Ausdruck zuordnet. Einfach machen

select field from table where field REGEXP '^-?[0-9]+$';

das ist einigermaßen schnell. Wenn Ihr Feld numerisch ist, testen Sie einfach für

ceil(field) = field

stattdessen.

192
Jumpy

Vergleichen Sie es mit einem regulären Ausdruck.

vgl. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 wie unten angegeben:

Re: IsNumeric () -Klausel in MySQL?
Gepostet von: kevinclark ()
Datum: 08. August 2005, 13:01 Uhr


Genau. Hier ist eine Funktion, die ich für MySQL 5 erstellt habe:

CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint
RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';


Dies ermöglicht ein optionales Plus-/Minuszeichen am Anfang, einen optionalen Dezimalpunkt und die restlichen Ziffern.

13
JBB

Angenommen, wir haben eine Spalte mit einem alphanumerischen Feld mit Einträgen wie

a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84

und Sie möchten den höchsten numerischen Wert aus dieser DB-Spalte (in diesem Fall 9582), dann wird diese Abfrage Ihnen helfen

SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
10
Tarun Sood

Hier ist die einfache Lösung für die Annahme, dass der Datentyp varchar ist

select * from calender where year > 0

Es wird true zurückgegeben, wenn das Jahr numerisch ist, andernfalls false

8
Jayjitraj

Das funktioniert auch:

CAST( coulmn_value AS UNSIGNED ) // will return 0 if not numeric string.

beispielsweise

SELECT CAST('a123' AS UNSIGNED) // returns 0
SELECT CAST('123' AS UNSIGNED) // returns 123 i.e. > 0
6
Riad

Um zu überprüfen, ob ein Wert in MySQL Int ist, können wir die folgende Abfrage verwenden. Diese Abfrage gibt die Zeilen mit Int-Werten an

SELECT col1 FROM table WHERE concat('',col * 1) = col;
4
minhas23

Wie wäre es mit:

WHERE table.field = "0" or CAST(table.field as SIGNED) != 0

auf numerisch und korrolär testen:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
3
Tom Auger

Das Beste, was ich mir für eine Variable vorstellen kann, ist ein Int. Ist eine Kombination mit den MySQL-Funktionen CAST() und LENGTH().
Diese Methode funktioniert für Strings, Ganzzahlen, Doubles/Floats-Datentypen.

SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int

siehe Demo http://sqlfiddle.com/#!9/ff40cd/44

es schlägt fehl, wenn die Spalte einen einzelnen Zeichenwert enthält. Wenn die Spalte den Wert 'A' hat, wird Cast ('A' als UNSIGNED) mit 0 und LENGTH (0) mit 1 bewertet. LENGTH (Cast ('A' als UNSIGNED)) = LENGTH (0) wird mit 0 bewertet 1 = 1 => 1

Der wahre Waqas Malik war total beschlagen, um diesen Fall zu testen. der patch ist.

SELECT <data>, (LENGTH(CAST(<data> AS UNSIGNED))) = CASE WHEN CAST(<data> AS UNSIGNED) = 0 THEN CAST(<data> AS UNSIGNED) ELSE (LENGTH(<data>)) END AS is_int;

Ergebnisse

**Query #1**

    SELECT 1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1 AS UNSIGNED) = 0 THEN CAST(1 AS UNSIGNED) ELSE (LENGTH(1)) END AS is_int;

| 1   | is_int |
| --- | ------ |
| 1   | 1      |

---
**Query #2**

    SELECT 1.1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1.1 AS UNSIGNED) = 0 THEN CAST(1.1 AS UNSIGNED) ELSE (LENGTH(1.1)) END AS is_int;

| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0      |

---
**Query #3**

    SELECT "1", (LENGTH(CAST("1" AS UNSIGNED))) = CASE WHEN CAST("1" AS UNSIGNED) = 0 THEN CAST("1" AS UNSIGNED) ELSE (LENGTH("1")) END AS is_int;

| 1   | is_int |
| --- | ------ |
| 1   | 1      |

---
**Query #4**

    SELECT "1.1", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1.1" AS UNSIGNED) = 0 THEN CAST("1.1" AS UNSIGNED) ELSE (LENGTH("1.1")) END AS is_int;

| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0      |

---
**Query #5**

    SELECT "1a", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1a" AS UNSIGNED) = 0 THEN CAST("1a" AS UNSIGNED) ELSE (LENGTH("1a")) END AS is_int;

| 1a  | is_int |
| --- | ------ |
| 1a  | 0      |

---
**Query #6**

    SELECT "1.1a", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("1.1a" AS UNSIGNED) = 0 THEN CAST("1.1a" AS UNSIGNED) ELSE (LENGTH("1.1a")) END AS is_int;

| 1.1a | is_int |
| ---- | ------ |
| 1.1a | 0      |

---
**Query #7**

    SELECT "a1", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("a1" AS UNSIGNED) = 0 THEN CAST("a1" AS UNSIGNED) ELSE (LENGTH("a1")) END AS is_int;

| a1  | is_int |
| --- | ------ |
| a1  | 0      |

---
**Query #8**

    SELECT "a1.1", (LENGTH(CAST("a1.1" AS UNSIGNED))) = CASE WHEN CAST("a1.1" AS UNSIGNED) = 0 THEN CAST("a1.1" AS UNSIGNED) ELSE (LENGTH("a1.1")) END AS is_int;

| a1.1 | is_int |
| ---- | ------ |
| a1.1 | 0      |

---
**Query #9**

    SELECT "a", (LENGTH(CAST("a" AS UNSIGNED))) = CASE WHEN CAST("a" AS UNSIGNED) = 0 THEN CAST("a" AS UNSIGNED) ELSE (LENGTH("a")) END AS is_int;

| a   | is_int |
| --- | ------ |
| a   | 0      |

siehe Demo

2
Raymond Nijland

Ich habe versucht, die oben aufgeführten regulären Ausdrücke zu verwenden, aber sie funktionieren für Folgendes nicht:

SELECT '12 INCHES' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...

Das obige wird zurückkehren 1 (TRUE), dh der Test der Zeichenfolge '12 INCHES 'gegen den obigen regulären Ausdruck, gibt TRUE zurück. Es sieht aus wie eine Zahl, die auf dem oben verwendeten regulären Ausdruck basiert. In diesem Fall interpretiert der reguläre Ausdruck die 12 als Zahl, da sie sich am Anfang der Zeichenfolge befindet.

Folgendes gibt den richtigen Wert zurück (d. H. 0), da die Zeichenfolge mit Zeichen anstelle von Ziffern beginnt

SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...

Das obige wird zurückkehren 0 (FALSE), da der Anfang der Zeichenfolge aus Text und nicht aus Zahlen besteht.

Wenn Sie es jedoch mit Zeichenfolgen zu tun haben, deren Zahlen und Buchstaben mit einer Zahl beginnen, erhalten Sie nicht die gewünschten Ergebnisse. REGEXP interpretiert die Zeichenfolge als gültige Zahl, obwohl dies nicht der Fall ist.

2
Bill Kelly

Dies funktioniert gut für VARCHAR, wo es mit einer Zahl beginnt oder nicht.

WHERE concat('',fieldname * 1) != fieldname 

möglicherweise gibt es Einschränkungen, wenn Sie zu den größeren NNNNE + - Nummern gelangen

0
PodTech.io

für mich funktioniert nur:

CREATE FUNCTION IsNumeric (SIN VARCHAR(1024)) RETURNS TINYINT
RETURN SIN REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';

von kevinclark geben alle anderen nutzlosen sachen für mich zurück im fall von 234jk456 oder 12 inches

0
Tim