检查字符串中的两位十进制数字

时间:2015-06-12 11:00:26

标签: sql sql-server sql-server-2008 select

我有两套记录

设置1:

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

设置2:

1.15
1.1

在第1组中,我需要检查哪些值为空''或以+符号开头且大于125。

在Set 2中,我需要检查哪些值小于两位小数

上述集的示例输出:

''
+135
1.1

7 个答案:

答案 0 :(得分:3)

在SQL-Server中可能是这样的:

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

答案 1 :(得分:2)

对于第一组,您可以使用like运算符检查字符串是否以&#39; +&#39;开头。然后将其转换为numeric并将其与125进行比较。事先使用isnumeric有助于避免出错:

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

对于第二组,您可以将like运算符与_一起使用,即单字符通配符:

WHERE col NOT LIKE '%.__%'

答案 2 :(得分:2)

一种方式:

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

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

答案 3 :(得分: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

答案 4 :(得分: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

答案 5 :(得分:0)

我不知道你的表结构我把它分成两个查询

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

这将返回null和&#39;&#39;值以及以&#39; +&#39;开头的值并且大于125

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

返回小数位数小于2的所有值

答案 6 :(得分: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()可以在<{em> isnumeric()之前处理。控制处理顺序的 only 语句是case,这就是第一个版本在case子句中自由使用where的原因。注意:子查询和CTE不会影响排序。

SQL Server 2012+提供try_convert()功能,有助于转换中的错误处理。