当前位置: 首页 > 面试题库 >

在varchar列中查找非数字值

齐昆
2023-03-14
问题内容

要求 :

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

可用值:

表名称,列名称,允许的精度,允许的比例

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

我的解决方案:

使用Regexp验证号码 NOT REGEXP_LIKE(COLUMN_NAME, '^-?[0-9.]+$')

验证左部分的长度(十进制前)(我不知道它的实际名称是什么),因为对于小数位数,oracle会在需要时自动四舍五入。由于实际列为varchar,因此我将使用substr,instr在小数点左侧找到组件

如上所述,Regexp允许使用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,但总体上来说,我的效率非常低下。

我将非常感谢[以任何方式]更好的解决方案。

提前致谢。


问题答案:

精度意味着您最多需要allowed_precision数字中的数字(严格来说,不计算前导零,但我会忽略这一点)。刻度表示最多allowed_scale可以在小数点后。

这建议使用正则表达式,例如:

[-]?[0-9]{1,<before>}[.]?[0-9]{0,<after>}

您可以构造正则表达式:

NOT REGEXP_LIKE(COLUMN_NAME,
                REPLACE(REPLACE('[-]?[0-9]{1,<before>}[.]?[0-9]{0,<after>}', '<before>', allowed_precision - allowed_scale
                               ), '<after>', allowed_scale)

现在,变量正则表达式的效率非常低。您也可以使用like和其他功能来执行逻辑。我认为条件是:

(column_name not like '%.%.%' and
 column_name not like '_%-%' and
 translate(column_name, '0123456789-.x', 'x') is null and
 length(translate(column_name, '-.x', 'x') <= allowed_precision and
 length(translate(column_name, '-.x', 'x') >= 1 and
 instr(translate(column_name, '-.x', 'x'), '.') <= allowed_precision - allowed_scale
)


 类似资料:
  • 本文向大家介绍如何从MySQL的varchar列中仅选择非数字值?,包括了如何从MySQL的varchar列中仅选择非数字值?的使用技巧和注意事项,需要的朋友参考一下 您需要为此使用REGEXP。语法如下 为了理解这个概念,让我们创建一个表。创建表的查询如下 使用insert命令在表中插入一些记录。查询如下 使用select语句显示表中的所有记录。查询如下 以下是输出 这是选择非数字值的查询 以下

  • 问题内容: 基本上,我只需要获取一个5位数的数字,并用空格分隔即可。5位数字可以在varchar中的任何位置。 示例:我在SQL 2008表中有一个varchar列,其中包含这些各种数据 5位数字可以在任何空格之间分隔的地方,什么是最好的提取方法呢? 谢谢 这样的行应返回空白 在没有运气的情况下尝试了以下内容 我想我需要结合使用对varchar中的空间数量进行计数。和以上。但我不确定该怎么做 问题

  • 问题内容: 我为此感到苦恼,因为我确定十几个for循环不是解决此问题的方法: 有一个排序的数字列表,例如 并且我想创建一个包含数字列表的字典,其中数字的差(紧随其后)不超过15。因此输出如下: 我当前的解决方案有点难看(我必须在末尾删除重复项……),我确信它可以用pythonic方式完成。 这就是我现在要做的: 问题答案: 如果您的列表很小,这不是绝对必要的,但是我可能会以“流处理”的方式进行处理

  • 我有一个有点奇怪的问题。 我有一个“word”对象列表。“word”对象包含一个字符串myCWord,它等于传入word的字符串的规范版本。 规范形式是字符串中的排序字符。 现在我有了一个单词列表,在这里我可以访问它们所包含的字符串的规范版本。 我需要一个算法来创建“子列表”,这些列表包含一组单词,这些单词是每个单词的字谜。

  • 问题内容: 实际上,几周前有人问我自己,而我确切地知道如何使用SP或UDF来执行此操作,但是我想知道是否有没有这些方法的快速简便的方法。我假设有,但我找不到。 我需要说明的一点是,尽管我们知道允许使用哪些字符(az,AZ,0-9),但我们 不想指定 不允许使用的字符(#@!$等…)。另外,我们希望拉出 包含 非法字符的行,以便可以将其列出给用户修复(由于我们无法控制输入过程,因此此时无法执行任何操

  • 问题内容: 我已经阅读了许多答案,但是它们全都适用于PL / SQL或Oracle,对于Microsoft SQL-Server我找不到任何答案。 我的桌子: 如何查找所有非空列的名称。 返回表仅包含非空列 根据评论进行编辑: 我知道的属性。但是,仅仅因为一列允许空值并不意味着它实际上将具有空值。如何找出实际上具有空值的列。 我正在寻找与Microsoft SQL-SERVER相当的产品。 问题答