【发布时间】:2020-06-12 20:31:44
【问题描述】:
我正在将一些现有的 Oracle 查询转换为 MSSQL Server (2008),但不知道如何复制以下正则表达式检查:
SELECT SomeField
FROM SomeTable
WHERE NOT REGEXP_LIKE(TO_CHAR(SomeField), '^[0-9]{2}[.][0-9]{7}$');
这将查找数字格式以 2 个正数开头、后跟一个小数点和 7 个小数位的数据的所有结果:12.3456789
我尝试过使用STR、CAST、CONVERT,但由于某种原因,它们似乎都将小数点截断为小数点后 4 位。截断使我无法使用LEN 和CHARINDEX 获得可靠的结果。手动将大小参数添加到STR 会稍微接近一些,但我仍然不知道如何将原始数值表示与转换后的值进行比较。
SELECT SomeField
, STR(SomeField, 10, 7)
, CAST(SomeField AS VARCHAR)
, LEN(SomeField )
, CHARINDEX(STR(SomeField ), '.')
FROM SomeTable
+------------------+------------+---------+-----+-----------+
| Orig | STR | Cast | LEN | CHARINDEX |
+------------------+------------+---------+-----+-----------+
| 31.44650944 | 31.4465094 | 31.4465 | 7 | 0 |
| 35.85609 | 35.8560900 | 35.8561 | 7 | 0 |
| 54.589623 | 54.5896230 | 54.5896 | 7 | 0 |
| 31.92653899 | 31.9265390 | 31.9265 | 7 | 0 |
| 31.4523333333333 | 31.4523333 | 31.4523 | 7 | 0 |
| 31.40208955 | 31.4020895 | 31.4021 | 7 | 0 |
| 51.3047869443893 | 51.3047869 | 51.3048 | 7 | 0 |
| 51 | 51.0000000 | 51 | 2 | 0 |
| 32.220633 | 32.2206330 | 32.2206 | 7 | 0 |
| 35.769247 | 35.7692470 | 35.7692 | 7 | 0 |
| 35.071022 | 35.0710220 | 35.071 | 6 | 0 |
+------------------+------------+---------+-----+-----------+
【问题讨论】:
-
SomeField的数据类型是什么? -
@MartinSmith 这是
float -
对数字进行字符串比较毫无意义。只需使用
where somefield >= 0 and somefield < 100。 -
@ParrishHusband 。 . .我添加了 Oracle 标记,因为您正在使用
numbers 的神秘功能,该功能适用于 Oracle,但不适用于 SQL Server。 -
Float 使它更不合理,因为
SELECT CAST(CAST(31.1111111 AS float) AS decimal(38,36))返回31.111111099999998685916580143384635448。无论如何,您将无法区分31.111111099999998685916580143384635448和31.1111111
标签: sql sql-server oracle sql-server-2008