2015-06-12 10 views
9

Mam dwa zestawy rekordówSprawdź dwóch dziesiętnych liczby cyfr w ciąg

zestaw 1:

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

Set 2:

1.15 
1.1 

w zestawie 1 Muszę sprawdzić jakie wartości są puste '' lub rozpoczynają się znakiem + i są większe niż 125.

In Zestaw 2 muszę sprawdzić, które wartości mają mniej niż dwa miejsca po przecinku

Przykâadowa dla powyższych zestawach:

'' 
+135 
1.1 
+2

Z jakiego RDBMS korzystasz? – Mureinik

+0

SQL SERVER 2008 – akhrot

+0

@akhrot sprawdź moją odpowiedź, to powinno działać dla ciebie. –

Odpowiedz

3

W SQL Server może być coś takiego:

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 '%._' 

WYJŚCIE :

'' -- blank 
+135 
1.1 

SQL FIDDLE

+0

Liczby całkowite mają również mniej niż dwa miejsca po przecinku, a także liczby ujemne? – CyberDude

+0

Liczby całkowite nie mają kropek, a dla liczb ujemnych - 1 więcej. –

+0

@akhrot. . .Możesz zaakceptować dowolną odpowiedź, którą lubisz. Należy jednak pamiętać, że SQL Server * nie * gwarantuje kolejność oceny operatora "AND", więc nadal można uzyskać błąd konwersji na "-12 AN". Ponadto ten kod generuje błąd na ''+12 AN'' (http://www.sqlfiddle.com/#!6/9eecb7/443), chociaż nie jest to jedna z przykładowych wartości danych. Instrukcja 'case' jest jedynym * sposobem * w SQL Server do kontrolowania porządku oceny wyrażenia w pojedynczej instrukcji. –

2

Dla pierwszego zestawu można użyć operatora like, aby sprawdzić, czy ciąg rozpoczyna się od "+", a następnie przesłać go do numeric i porównać z 125.Korzystanie isnumeric wcześniej pomogą uniknąć błędów rzucania:

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

dla drugiego zestawu, można użyć operatora like z _, pojedynczy symbol wieloznaczny:

WHERE col NOT LIKE '%.__%' 
2

Jednym ze sposobów:

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

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

Dzięki Alex. jego działanie: – akhrot

0

Nie znając twojej struktury tabeli podzieliłem ją na dwa pytania:

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

ta zwraca null i „” wartości, jak i wartości zaczynające się od „+” i większa niż 125

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

ta zwraca wszystkie wartości, które mają mniej niż 2 miejsca dziesiętne

+0

Hi Matt, otrzymuję komunikat o błędzie, ponieważ "INSTR" nie jest rozpoznawaną wbudowaną nazwą funkcji. Proszę o pomoc – akhrot

2

First:

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

drugie:

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

Dla dziesiętnych:

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

Zakładając, że wartości są nvarchar, tutaj jest:

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

To jest trochę skomplikowane, ponieważ nie chcesz, aby uzyskać konwersję błąd. Poniższy powinna zarządzać tym:

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) 

Drugi jest łatwiejsze:

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

konwersje ciągów liczb - bez błędu - to kłopotliwe w SQL Server. W prawie wszystkich przypadkach nie masz pojęcia o kolejności operacji. Więc, co następuje często generuje błąd:

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

ponieważ cast() mogą być przetwarzane przedisnumeric(). Instrukcja, która kontroluje kolejność przetwarzania, to case, dlatego też pierwsza wersja zawiera w klauzuli w klauzuli where. Uwaga: podzapytania i CTE nie wpływają na kolejność.

SQL Server 2012+ oferuje funkcję try_convert(), która ułatwia przetwarzanie błędów w konwersjach.

+0

Dziękuję Panom. – akhrot