2015-06-12 11 views
9

Ich habe zwei Sätze von Aufzeichnungenprüfen für zwei Dezimalstellen stellige Zahl in String

Set 1:

-11 
-12 
-12 AN  
''  
-134 
-125 
+135 

Set 2:

1.15 
1.1 

In Set 1 Ich brauche welche Werte zu überprüfen sind entweder leer '' oder beginnen mit einem + zeichen und sind größer als 125.

In Set 2 Ich muss überprüfen, welche Werte haben weniger als zwei Dezimalstellen

Beispielausgabe für die obigen Sätze:

'' 
+135 
1.1 
+2

Welche RDBMS verwenden Sie? – Mureinik

+0

SQL SERVER 2008 – akhrot

+0

@akhrot überprüfen Sie meine Antwort, es sollte für Sie arbeiten. –

Antwort

3

In SQL-Server so etwas wie das sein könnte:

WITH cte AS (
SELECT Col 
FROM set1 
WHERE Col = '' OR Col LIKE'+%' AND (CAST(REPLACE(REPLACE(Col,'+',''),'-','') AS INT) > 125) 
) 
SELECT * FROM cte 
UNION ALL 
SELECT Col 
FROM set2 
WHERE Col LIKE '%._' 

OUTPUT :

'' -- blank 
+135 
1.1 

SQL FIDDLE

+0

Integer Zahlen haben auch weniger als zwei Dezimalstellen und auch, was ist mit negativen Zahlen? – CyberDude

+0

Integer Zahlen haben keinen Punkt und für negative Zahlen 1 mehr ersetzen. –

+0

@akhrot. . .Sie können akzeptieren, welche Antwort Sie mögen. Sie sollten jedoch beachten, dass SQL Server * nicht * die Reihenfolge der Auswertung des AND-Operators garantiert, so dass Sie immer noch einen Konvertierungsfehler auf "-12 AN" erhalten können. Außerdem erzeugt dieser Code einen Fehler auf "+12 AN" (http://www.sqlfiddle.com/#!6/9eecb7/443), obwohl dies nicht einer Ihrer Beispieldatenwerte ist. Die 'case'-Anweisung ist die einzige Möglichkeit in SQL Server, die Reihenfolge der Ausdrucksauswertung in einer einzigen Anweisung zu steuern. –

2

Für den ersten Satz, können Sie den like Operator überprüfen, ob eine Zeichenfolge mit ‚+‘ beginnt und werfen es dann zu numeric und vergleichen Sie es mit 125.Mit isnumeric vorher helfen Gussfehler zu vermeiden:

WHERE col = '' OR 
     (col LIKE '+%' AND ISNUMERIC(col) AND CAST(col AS NUMERIC) > 125) 

Für den zweiten Satz, können Sie den like Operator mit _ verwenden können, das einzelne Zeichen Wildcard:

WHERE col NOT LIKE '%.__%' 
2

One way:

where f = '' or (f like '+%' and isnumeric(f) = 1 and f > 0) 

where isnumeric(f) = 1 and f like '%.[0-9]' 
+0

Danke Alex. seine Arbeit – akhrot

0

Ohne Ihre Tabellenstruktur zu kennen, habe ich diese in zwei Abfragen aufgeteilt

SELECT set1 
FROM yourtable 
WHERE set1 IS NULL 
OR set1 = '''' 
OR (LEFT(set1 , 1) = '+' AND set > 125 

Dieser Wert null zurück und ‚‘ Werte sowie Werte beginnend mit ‚+‘ und mehr als 125

SELECT set2 
FROM yourtable 
WHERE LENGTH(SUBSTRING(set2,CHARINDEX(".",set2))) < 2 

Diese liefert alle Werte, die weniger als 2 Dezimalstellen

+0

Hallo Matt, ich bekomme Fehlermeldung als 'INSTR' ist kein anerkannter integrierter Funktionsname. Bitte helfen Sie – akhrot

2

Erstens:

WHERE v = '' OR (v NOT LIKE '%[^+0-9]%' AND v > 125) 

Zweitens:

WHERE v NOT LIKE '%[^.0-9]%' AND (v LIKE '%._' OR (v NOT LIKE '%.%' AND v LIKE '%_%')) 

Für Dezimalzahlen:

WHERE FLOOR(v*10) = v*10 
1

die Werte Unter der Annahme sind nvarchar, hier ist es:

SELECT 
    Value 
FROM 
    MyTable 
WHERE 
    Value = '' -- is empty string 
    OR 
     Value LIKE '+%' -- starts with a plus sign 
     AND ISNUMERIC(Value) = 1 -- is a number 
     AND CONVERT(DECIMAL(18,10), Value) > 125 -- is greater than 125 

UNION ALL 

SELECT 
    Value 
FROM 
    MyTable 
WHERE 
    ISNUMERIC(Value) = 1 -- is a number 
    AND (CONVERT(DECIMAL(18,10), Value) * 10) % 1 = 0 -- has at most 2 decimal places 
0

Das ist ein bisschen schwierig ist, weil Sie nicht über eine Umwandlung erhalten möchten Error. Die folgende Beschreibung ist diese verwalten:

select * 
from set1 
where 1 = (case when col = '' then 1 
       when col like '+[0-9][0-9[0-9]%' and isnumeric(col, left(5)) 
        (case when cast(left(col, 5)) > 125 then 1 end) 
       when col like '+[0-9][0-9[0-9]%' and isnumeric(col, left(4)) 
        (case when cast(left(col, 4)) > 125 then 1 end) 
      end) 

Die zweite ist einfacher:

select * 
from set2 
where col like '%[.][0-9][0-9]% 

Konvertierungen von Zeichenfolgen in Zahlen - ohne Fehler - ist mühsam in SQL Server. In fast allen Fällen haben Sie keine Ahnung von der Reihenfolge der Operationen. So erzeugt die folgenden häufig einen Fehler:

select s.*, cast(col as number) 
from set1 
where isnumeric(col); 

weil die cast()vor die isnumeric() verarbeitet werden können. Die nur Anweisung, die die Reihenfolge der Verarbeitung steuert, ist case, weshalb die erste Version case in der where Klausel großzügig verwendet. Hinweis: Unterabfragen und CTEs haben keinen Einfluss auf die Reihenfolge.

SQL Server 2012+ bietet die try_convert()-Funktion, die Fehlerverarbeitung in Konvertierungen erleichtert.

+0

Vielen Dank Herren. – akhrot

Verwandte Themen