在 varchar 列中查找非数字值

2024-02-01

要求 :

通用查询/函数,用于检查表中 varchar 列中提供的值是否实际上是数字且精度不超过允许的精度。

可用值:

表名称、列名称、允许的精度、允许的小数位数

一般建议是创建一个函数并使用 to_number() 来验证该值,但它不会验证允许的长度(精度范围)。

我的解决方案:

使用正则表达式验证数字NOT REGEXP_LIKE(COLUMN_NAME, '^-?[0-9.]+$')

验证左侧组件的长度(小数点之前)(我不知道它的实际名称是什么),因为对于比例,oracle 如果需要,会自动四舍五入。由于实际列是 varchar 我将使用 substr, instr 来查找小数点左侧的组件。

如上所述,正则表达式允许像 123...123124..55 这样的数字,我还将验证小数点的数量。 [如果 > 1 则错误]

查询查找无效号码:

Select * From Table_Name 
Where
(NOT REGEXP_LIKE(COLUMN_NAME, '^-?[0-9.]+$')
OR
Function_To_Fetch_Left_Component(COLUMN_NAME) > (Precision-Scale)
/* Can use regexp_substr now but i already had a function for that */
OR
LENGTH(Column_Name) - LENGTH(REPLACE(Column_Name,'.','')) > 1
/* Can use regexp_count aswell*/)

我对我的解决方案感到高兴和满意,直到一列只有“.”。价值逃过了我的支票,我看到了我的支票的局限性。虽然添加另一个检查来验证这一点也可以解决我的问题solution总的来说,我觉得效率很低。

我真的很感激[以任何方式]更好的解决方案。

提前致谢。


寻找:

  • 一位或多位数字(可选)后跟小数点和零位或多位数字;或者
  • 前导小数点(前面无单位数字),然后是一位或多位(十进制)数字。

像这样:

Select *
From   Table_Name 
Where  NOT REGEXP_LIKE(COLUMN_NAME, '^[+-]?(\d+(\.\d*)?|\.\d+)$')

如果您不想在数字字符串中使用零填充值,则:

Select *
From   Table_Name 
Where  NOT REGEXP_LIKE(COLUMN_NAME, '^[+-]?(([1-9]\d*|0)(\.\d*)?|\.\d+)$')

具有精度和规模(假设它按照NUMBER( precision, scale )数据类型和scale < precision):

Select *
From   Table_Name 
Where  NOT REGEXP_LIKE(COLUMN_NAME, '^[+-]?(\d{1,'||(precision-scale)||'}(\.\d{0,'||scale||'})?|\.\d{1,'||scale||'})$')

或者,对于具有精度和小数位数的非零填充数字:

Select *
From   Table_Name 
Where  NOT REGEXP_LIKE(COLUMN_NAME, '^[+-]?(([1-9]\d{0,'||(precision-scale-1)||'}|0)(\.\d{0,'||scale||'})?|\.\d{1,'||scale||'})$')

或者,对于任何精度和比例:

Select *
From   Table_Name 
Where  NOT REGEXP_LIKE(
             COLUMN_NAME,
             CASE
               WHEN scale <= 0
               THEN '^[+-]?(\d{1,'||precision||'}0{'||(-scale)||'})$'
               WHEN scale < precision
               THEN '^[+-]?(\d{1,'||(precision-scale)||'}(\.\d{0,'||scale||'})?|\.\d{1,'||scale||'})$'
               WHEN scale >= precision
               THEN '^[+-]?(0(\.0{0,'||scale||'})?|0?\.0{'||(scale-precision)||'}\d{1,'||precision||'})$'
             END
           )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 varchar 列中查找非数字值 的相关文章

  • 转置和聚合 Oracle 列数据

    我有以下数据 Base End RMSA Item 1 RMSA Item 2 RMSA Item 3 RMSB Item 1 RMSB Item 2 RMSC Item 4 我想将其转换为以下格式 Key Products RMSA RM
  • 从 CTE 插入

    WITH DTL AS SELECT CMPI CODE CMN CDTY MTRL CMI WT FACTOR CMI CNTRCT RATE PL PRESENT PRICE TRM CODE ROUND NVL PRESENT PRI
  • 删除或更改 ETL 中的记录

    我有一个表 我在上面构建了 ETL 服务 货物记录 到达 离开 进入表格 我已经这样做了 我的桌子将被删除 当项目标识符第二次到达数据库时 两条记录都被删除 label cost time x2 29 14 5 2020 01 00 00
  • sql查询中case语句中的布尔值

    我在选择查询中使用 case 语句 类似这样 Select col1 col2 isActive case when col3 abc then 1 else 0 end col4 from
  • max()、分组依据和排序依据

    我有以下 SQL 语句 SELECT t client id max t points AS max FROM sessions GROUP BY t client id 它只是列出了客户 ID 以及他们所获得的最大积分 现在我想按 max
  • 如何使用 Alter Table 在 Access 中创建小数字段?

    我想以编程方式在 MS Access 表中创建一个新列 我尝试过很多排列ALTER TABLE MyTable Add MyField DECIMAL 9 4 NULL 并得到 字段定义中的语法错误 我可以轻松创建一个数字字段Double类
  • 随机排列每行的列值

    我正在使用 C NET 开发多项选择题考试生成器 每次做出报告时 都会在数据库中随机挑选问题 并随机调整选项 我可以做随机问题部分 但我不能做选择的洗牌 我有一张表 其中一行如下 question answer distractor1 di
  • 通过字符串操作预防 PHP SQL 注入[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中防止 SQL 注入的最佳方法 https stackoverflow com questions 60174 best way to prevent sql injection in php
  • PLS-00103:遇到符号“CREATE”

    这个包有什么问题 因为它给出了错误 CREATE OR REPLACE PACKAGE PKG SHOW CUST DETAILS AS PROCEDURE SHOW CUST DETAILS myArg VARCHAR2 END PKG
  • PostgreSQL & regexp_split_to_array + 取消嵌套

    我有这样的绳子 测试1 纽约 X 测试 2 芝加哥 Y 测试 3 宾夕法尼亚州哈里斯堡 Z 我需要的结果是 Column1 Column 2 Column3 Test 1 new york X Test 2 chicago Y Test 3
  • 在bigquery中比较两个表的有效方法

    我有兴趣比较两个表是否包含相同的数据 我可以这样做 standardSQL SELECT key1 key2 FROM SELECT table1 key1 table1 key2 table1 column1 table2 column1
  • 过滤项目来源

    通过此代码 我设置了数据网格的 ItemsSource 不过 我有更多的 wpf 控件来过滤数据网格 例如从时间范围过滤数据网格 我可以为此编写一个新查询 但这似乎没有必要 因为数据已经可用 我只需要过滤它 最好的方法是什么 我能得到的任何
  • SQL 查询结果为字符串(或变量)

    是否可以将SQL查询结果输出到一个字符串或变量中 我的php和mysql不好 假设我有数据库 agents 其中包含列 agent id agent fname agent lname agent dept 使用此查询 sql SELECT
  • 如何显示 RSpec 测试生成的 SQL 查询日志?

    我正在为我的 Rails 3 应用程序编写规范 我想测试数据库事务是否真的有效 如果能够看到我的应用程序在规范驱动下生成的 sql 查询 这将非常有帮助 有没有办法像在 Rails 控制台中一样查看查询 我正在使用 Rails 3 0 9
  • Postgresql存储过程中基于会话的全局变量?

    在 Oracle 的 PL SQL 中 我可以使用包定义创建基于会话的全局变量 对于 Postgresql 的 PLpg SQL 这似乎是不可能的 因为没有包 只有独立的过程和函数 以下是 PL SQL 将 g spool key 声明为全
  • 常量值如何影响连接的 ON 子句?

    我最近发现 LEFT JOIN 的 ON 子句可能包含 1 1 等值 这让我感到不安 因为它打破了我对连接功能的看法 我遇到过以下情况的更详细版本 SELECT DISTINCT Person ID FROM Person LEFT JOI
  • 如何限制两个表之间一对多关系中的多个数量?

    我有一个带有两个 MySql 表的 MySQL 数据库 第一个是第一个表 表 A 有一列具有唯一值 从值 从 1 到 n 在第二个表 2 表 B 中 我有两列 在第一个表中我有一个名称 在第二个我的值从 1 到 n 如果我在 中添加一个值
  • ActiveRecord 查询,按关联排序,最后一个 has_many

    我试图列出所有Users by the created at最近创建的关联记录 通讯 列 到目前为止我所拥有的 User includes communications order communications created at IS
  • 将十六进制转换为字符串

    我想用HEXTORAW 从 ASCII 十六进制代码 30 获取 char 值 ASCII HEX 30 应返回 varchar 0 该怎么做呢 是HEXTORAW 正确的功能 你可以使用utl raw http docs oracle c
  • Postgresql:SERIAL 在约束 INSERT 失败时递增

    有一个像这样的简单表结构 CREATE TABLE test id INT PRIMARY KEY sid SERIAL 我注意到如果我尝试插入一行但它未通过约束测试 即主键约束 SERIAL计数器无论如何都会增加 所以下一次成功插入 si

随机推荐

  • 为复杂的跨平台程序创建安装程序

    我正在为一堆相对复杂的桌面应用程序绘制一个应用程序部署过程 我们有本机应用程序和 Java 应用程序 因此部署必须能够检查 JRE 是否存在并在需要时安装它 某些应用程序依赖于特殊硬件 因此部署还必须能够启动必要的驱动程序安装程序 一些应用
  • 使用 AsyncTask 时应用程序挂起并暂停所有线程

    我正在尝试使用AsyncTask类来获取网站的内容 logcat 告诉我W art Suspending all threads took 15 or any other number ms反复 我的应用程序被冻结 直到日志消息打印完成 日
  • 在 Powershell 中设置 InheritanceFlags 与 PropagationFlags

    我正在尝试找到 InheritanceFlags 和 PropagationFlags 的正确组合 以便我的新文件夹不会继承之前文件夹的权限 而是将权限传播到新文件夹中包含的文件夹 文件 我尝试交换我下面有两个 但这只给了新文件夹与上面的文
  • 将三个不同的列合并为 R 中的日期

    现在 我在 R 的数据文件中有 3 个单独的列 分别为年 月和日 如何将这三列合并为一列并使 R 理解它是日期 这是现在的样子 year mon day gnp 1947 1 1 238 1 1947 4 1 241 5 1947 7 1
  • Elasticsearch 在显示 t: failed to read local state , exiting 后崩溃

    我是 Elasticsearch 的新手 我在本地只运行一个节点 到目前为止 它运行良好 现在一启动就崩溃了 错误堆栈如下 C MyApps elasticsearch6 5 1 elasticsearch oss 6 5 1 elasti
  • 在 bash 中从占据终端整个宽度的破折号字符绘制一条水平线

    我需要一个命令来在终端中绘制一条水平 线 该线必须恰好等于终端长的宽度 无论当前终端宽度如何 并且由破折号字符组成 尽管也可以使用水平线的 unicode 符号 如果能上色就更好了 我需要像这样使用它 echo some text draw
  • WCF:OperationContext.IncomingMessageProperties.Via 返回错误的 URI

    我在 IIS 中托管 WCF 服务 我在 IIS 中为该站点设置了多个主机名绑定 但是 当向任何非默认绑定发出请求时 OperationContext IncomingMessageProperties Via 属性不会报告正确的 url
  • 如何加载共享库而不加载其依赖项?

    说我有一个图书馆libfoo so 1 这取决于 根据ldd on libbar so 1 然而 libbar so 1目前不可用 我的应用程序需要调用一个函数libfoo so 1这不需要libbar so 1 at all 有没有办法加
  • 局部变量的内存可以在其作用域之外访问吗?

    我有以下代码 include
  • 使用Servlet API,如何确定请求是HTTP/1.0还是HTTP/1.1?

    我正在修复一个错误 该错误仅在客户端使用 HTTP 1 0 并且是在防火墙后面秘密地进行 Internet Explorer 代理 时才会显现出来 详细信息在这里 https issues apache org jira browse TA
  • 获取日期中的小时和分钟 (HH:MM)

    我只想得到hh mm从日期 我怎样才能得到这个 我已经尝试过这个 CONVERT VARCHAR 8 getdate 108 只需使用前 5 个字符 SELECT CONVERT VARCHAR 5 getdate 108
  • 在 Java 中,在被调用方法之前和之后运行方法

    我正在尝试编写一个 Java 程序 以便在调用方法A 首先是一个名为methodBeforeA 被调用 然后方法A 执行后 另一个方法被调用命名 方法AfterA 这与 Junit 使用注释 使用 Before Test After 所做的
  • python mechanize 处理两个同名参数

    我正在登录一个页面 其中奇怪地有一个名为的表单输入login email和两个表单输入称为login password 我需要设置两者的值 但直接调用form login password 抛出错误 File Library Python
  • 将整数向量转换为 0 到 1 之间浮点数的最快精确方法

    考虑一个随机生成的 m256i向量 有没有更快 更精确的方法将它们转换为 m256之间的浮点数向量0 包括在内 和1 仅 比除以float 1ull lt lt 32 这是我到目前为止所尝试过的 其中iRand是输入和ans是输出 cons
  • 当线程“等待”某些东西时会发生什么

    When an async method awaits a Task当前正在运行的线程会发生什么 我推测 在 UI 线程上 消息循环将恢复 而在线程池线程上 线程将被释放回线程池 但是如果手动启动线程会发生什么呢 还有其他类型的线程吗 我花
  • 强制删除 boost::signals2 中的槽

    我发现 boost signals2 使用某种连接槽的惰性删除 这使得很难使用连接来管理对象的生命周期 我正在寻找一种方法来强制在断开连接时直接删除插槽 任何有关如何通过以不同方式设计我的代码来解决问题的想法也将受到赞赏 这是我的场景 我有
  • 在 FluentAssertions 中自定义失败处理

    我尝试使用 FluentAssertions 不仅作为测试断言框架 而且还检查运行时契约 例如高级 Debug Assert 并且我已阅读this https stackoverflow com questions 49724379 sho
  • 空手道 - 如何在 java 文件中使用 karate-config.js 变量?

    我有一个 DB utils java 文件 我需要根据运行代码的环境加载数据库用户名密码 并且需要从 karate config js 导入这些环境值 如何实现这一目标 只需使用嵌入表达式即可 所以如果你有dbusername and db
  • Python 多处理:如何在错误后干净地退出?

    我正在编写一些使用的代码multiprocessing模块 然而 由于我是新手 经常发生的情况是弹出一些错误 导致主应用程序停止运行 但是 该应用程序的子级仍然保持运行 并且我得到一长串正在运行的列表pythonw我的任务管理器列表中的进程
  • 在 varchar 列中查找非数字值

    要求 通用查询 函数 用于检查表中 varchar 列中提供的值是否实际上是数字且精度不超过允许的精度 可用值 表名称 列名称 允许的精度 允许的小数位数 一般建议是创建一个函数并使用 to number 来验证该值 但它不会验证允许的长度