如何计算Oracle SQL中从右侧开始的列中有多少个零

Posted

技术标签:

【中文标题】如何计算Oracle SQL中从右侧开始的列中有多少个零【英文标题】:How to Count How Many Zeros are within a column from the Right in Oracle SQL 【发布时间】:2020-03-16 02:42:29 【问题描述】:

我目前正在验证一个列,该列包含每个客户的参考号,但它们必须是特定格式才能被视为真实号码。

我最初收到了大约 80 个 csv 文件,并在通过确保所有表具有相同数量的列等过程之后将其上传到一个主表中(以下是一个示例,因为我有超过 90 个列)。

以下是我的创建表查询,我决定将所有内容保留为第一个 ID 列的 varchar 列栏,以确保不会丢失数据。

CREATE TABLE IF NOT EXISTS `master_table` (
  `id` int(11) NOT NULL,
  `Name` varchar(255) ,
  `Business_Name` varchar(255) ,
  `Contact_Person` varchar(255) ,
  `Tel_Number` varchar(255) ,
  `Tel_Number_2` varchar(255) ,
  `Email` varchar(255) ,
  `House_Name` varchar(255) ,
  `Door_Number` varchar(255) ,
  `Street` varchar(255) ,
  `Town` varchar(255) ,
  `Locality` varchar(255) ,
  `County` varchar(255) ,
  `Post_Code` varchar(255) ,
  `Supplier` varchar(255) ,
  `Annual_Usage` varchar(255) ,
  `Start_Date` varchar(255) ,
  `End_Date` varchar(255) ,
  `PA_Nmbr` varchar(255)
  ;

然后我上传了我所有的数据,这给了我大约 90 万行数据。

我感兴趣的特定列是 PA_Nmbr 列。要使其成为真正的参考编号,它需要 13 位长,因此我编写了以下查询以查看我的记录数:

SELECT
    SUM(CASE WHEN LEN <13 THEN CNT ELSE 0 END) AS UNDER_13,     -- 201,112
    SUM(CASE WHEN LEN =13 THEN CNT ELSE 0 END) AS PA_13,      -- 701,019
    SUM(CASE WHEN LEN >13 THEN CNT ELSE 0 END) AS OVER_13       -- 942
FROM
(
SELECT
    LENGTH(PA_NMBR) AS LEN,
    COUNT(*) AS CNT
FROM
    master_table
GROUP BY
    LENGTH(PA_NMBR)
) A
;

所以这告诉我大约 70% 的数据具有正确的长度,但下一个检查是确保当我将数据添加到数据库中时,数字没有被四舍五入。因此,例如,如果有一个真正的数字 1234567899999,并且已经四舍五入到 1234567890000。

所以我卡住的地方是我想写一个查询,我可以从右侧计算它们在列中有多少个 0。

因此,如果我想快速检查并计算我有多少记录以数字开头,即 1234,然后全为 0,我可以快速做到这一点。这会告诉我数据本身存在问题。

如果有人能就如何编写此查询提出建议,我将不胜感激。

提前致谢。

【问题讨论】:

您的 create table 看起来像 mysql,而不是 Oracle。请说明您真正使用的是什么数据库。 嗨 Gordon,原始表位于 phpMyAdmin 环境下的 MySQL 中,但我使用 SQL Developer 作为我的客户端,因为这是我习惯使用的工具,因此会造成混淆。 所以你想要一些兼容 MySQL 的东西? 嗨,尼克,不一定,我上面写的查询已经在 Oracle SQL 中运行,所以理想情况下更喜欢使用它。 【参考方案1】:

看看 SELECT LEN(REPLACE('YYNYNYYNNNYYNY', 'N', '')) 方法。此处已提出并回答了类似的问题:How to count instances of character in SQL Column

【讨论】:

嗨尼克,谢谢你,效果很好。无论如何,它是否可以从右侧而不是整体进行检查? 抱歉,是的,我在这里忘记了“从右到右”的要求。在那种情况下,也许您想研究 Sub-string 方法?看看这里,我认为这可能会有所帮助sqlshack.com/sql-substring-function-overview 谢谢尼克,非常感谢

以上是关于如何计算Oracle SQL中从右侧开始的列中有多少个零的主要内容,如果未能解决你的问题,请参考以下文章

在每一行中从多个不同的列中查找唯一值

如何重命名SQL Server中计算列中引用的列?

oracle sql语句

急急急!!! oracle中怎样在特定的列后添加新的列

如何计算某些值在 SQL 表中出现的次数并在列中返回该数字?

如何在 Oracle PL/SQL 过程的开始部分之后声明游标