2009-07-03 3 views
2

Eine der Spalten in meiner Tabelle ist ein Varchar, das nur numerische Werte enthalten soll (ich kann die Definition nicht in eine Zahlenspalte ändern). Daher ist meine SQL-Abfrage:SQL: Wie finde ich, wenn der Inhalt einer Varchar-Spalte numerisch ist?

schlägt fehl, weil für einige Zeile der Inhalt der Spalte nicht numerisch ist.

Was ist eine select Abfrage, die ich verwenden kann, um diese Zeilen zu finden?

Ich bin mit einer Oracle-Datenbank

Ich bin für so etwas wie eine is_number Funktion suchen.

Antwort

7

Es gibt keine native „IsNumeric“ -Funktion im Orakel, aber dieser Link zeigt Ihnen, wie man machen: http://www.oracle.com/technetwork/issue-archive/o44asktom-089519.html

CREATE OR REPLACE FUNCTION isnumeric(p_string in varchar2) 
RETURN BOOLEAN 
AS 
    l_number number; 
BEGIN 
    l_number := p_string; 
    RETURN TRUE; 
EXCEPTION 
    WHEN OTHERS THEN 
     RETURN FALSE; 
END; 
/
+1

Das ist nicht nicht zu einem Artikel/Lösung mehr Anknüpfungspunkt. – TechnoCore

+1

Ein Beispiel dafür, warum Antworten die Frage eigentlich beantworten sollten, keine Links zu der Antwort. Der ursprüngliche Artikel ist von der Wayback-Maschine verfügbar: http://web.archive.org/web/20100701194827/http://www.oracle.com/technology/oramag/oracle/04-jul/o44asktom.html –

1

Unter Umständen müssen Sie für sich selbst entscheiden, was ist numerisch. Oracle konvertiert gerne Zeichenketten in wissenschaftlicher Notation (zB '1e10') in Zahlen, aber es wird wegen des Kommas auf etwas wie '1000' stoßen.

+0

Die Dezimalzahl Das Trennzeichen hängt von den NLS-Einstellungen ab: NLS_NUMERIC_CHARACTERS – tuinstoel

4

Ich bin nicht anderer Meinung, dass die beste Lösung ist, Tom Kytes Beispielen zu folgen, mit denen andere schon verbunden sind. Wenn Sie jedoch nur etwas brauchen, das nur SQL ist, weil Sie leider keine Beziehung mit Ihrem DBA haben, um pl/sql-Funktionen zu Ihrem Schema hinzuzufügen, könnten Sie möglicherweise reguläre Ausdrücke verwenden, um ein grundlegendes Bedürfnis zu erfüllen. Beispiel:

select '234', REGEXP_SUBSTR('234','^\d*\.{0,1}\d+$') from dual 
union all 
select 'abc', REGEXP_SUBSTR('abc','^\d*\.{0,1}\d+$') from dual 
union all 
select '234234abc', REGEXP_SUBSTR('234234abc','^\d*\.{0,1}\d+$') from dual 
union all 
select '100.4', REGEXP_SUBSTR('100.4','^\d*\.{0,1}\d+$') from dual 
union all 
select '-100.4', REGEXP_SUBSTR('-100.4','^\d*\.{0,1}\d+$') from dual 
union all 
select '', REGEXP_SUBSTR('','^\d*\.{0,1}\d+$') from dual 

Unten finden Sie die Ausgabe der oben:

INPUT  RESULT 
234  234 
abc  - 
234234abc - 
100.4  100.4 
-100.4  -  
Verwandte Themen