我有两套记录
设置1:
-11
-12
-12 AN
''
-134
-125
+135
设置2:
1.15
1.1
在第1组中,我需要检查哪些值为空''
或以+
符号开头且大于125。
在Set 2中,我需要检查哪些值小于两位小数
上述集的示例输出:
''
+135
1.1
答案 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()
功能,有助于转换中的错误处理。