2015-06-12 3 views
9

У меня есть два набора записейПроверка для двух десятичных цифр в строке

Set 1:

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

Набор 2:

1.15 
1.1 

В наборе 1 нужно проверить, какие значения либо начинаются с '', либо начинаются с знака + и превышают 125.

В Установить 2 нужно проверить, какие значения имеют менее двух знаков после запятой

Пример вывода для указанных наборов:

'' 
+135 
1.1 
+2

Какие СУБД вы используете? – Mureinik

+0

SQL SERVER 2008 – akhrot

+0

@akhrot проверить мой ответ, он должен работать на вас. –

ответ

3

В SQL-сервер может быть что-то вроде этого:

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

ВЫХОД :

'' -- blank 
+135 
1.1 

SQL FIDDLE

+0

Целочисленные числа также имеют менее двух знаков после запятой, а также, что относительно отрицательных чисел? – CyberDude

+0

Целочисленные числа не имеют точки, а для отрицательных чисел добавлено еще 1 место. –

+0

@akhrot. , ,Вы можете принять любой ответ, который вам нравится. Однако вы должны знать, что SQL Server не гарантирует * порядок оценки оператора 'AND', поэтому вы можете получить ошибку преобразования на' '-12 AN''. Кроме того, этот код генерирует ошибку на '+12 AN'' (http://www.sqlfiddle.com/#!6/9eecb7/443), хотя это не одно из ваших значений данных образца. Оператор 'case' - это метод * only * в SQL Server для управления порядком оценки выражения в одном выражении. –

2

Для первого набора, вы можете использовать оператор like, чтобы проверить, если строка начинается с «+», а затем бросить его numeric и сравнить его с 125.Использование isnumeric заранее поможет избежать ошибок литья:

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

Для второго набора, вы можете использовать оператор like с _, единственный символ подстановки:

WHERE col NOT LIKE '%.__%' 
2

Один из способов:

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

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

Спасибо Алекс. его работа – akhrot

0

Не зная вашей структуры таблицы, я разделил это на два запроса

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

Это возвращает нуль и «» значения, а также значения, начинающиеся с «+» и больше, чем 125

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

Это возвращает все значения, которые имеют меньше чем 2 знака после запятой

+0

Привет Мэтт, я получаю сообщение об ошибке, поскольку «INSTR» не является признанным встроенным именем функции. Пожалуйста, помогите – akhrot

2

Первое:

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

Второе:

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

Для десятичных знаков:

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

Предполагая, что значения являются nvarchar, здесь:

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

Это немного сложнее, потому что вы не хотите, чтобы получить конверсию ошибка. Ниже следует управлять этим:

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) 

второй проще:

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

Конверсии строк с номерами - без ошибок - это хлопотно в SQL Server. Практически во всех случаях вы не имеете представления о порядке операций. Таким образом, следующее часто генерирует ошибку:

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

потому что cast() может быть обработан до того isnumeric(). Оператор , который контролирует порядок обработки, составляет case, поэтому первая версия использует case в предложении where. Примечание: подзапросы и CTE не влияют на порядок.

SQL Server 2012+ предлагает функцию try_convert(), которая облегчает обработку ошибок в конверсиях.

+0

Спасибо вам, господа. – akhrot