目录

介绍

背景

使用代码

兴趣点


我如何才能从查询中获取非空字段?是的,您可以使用现代的编程语言轻松完成此操作,但是通过从表中获取冗余信息可能会浪费资源,而且很多时候,它可能会添加冗余代码。从5.3版开始,此任务仅面向MySQL。

介绍

您拥有大量的信息,其中包含大量的电子表格,csv,xml,bin,日志或纯文本文件,并且经过简化后,表中有几列没有值,当然也没有NULL 值。对于桌面用户,这可能只是一个烦恼。另一方面,对于云用户,您可能没有便宜的资源,而成本仅需支付少量账单。对于DBA,那些NULL占很大空间,它们没有数据。但是事实是,ETL作业仅带来数据,而在此无罪。出于教学目的,本文使用非常流行的MySQL数据库引擎解决了这种情况。

背景

我借助一个基于流视频商店服务公司的名为cinemashop的数据库,给出了这种情况的示例。它在MySQL上运行,但对于MariaDB和Percona分支也将起作用。这些方面的工作可以从这里进一步推进。

使用代码

在cinemashop数据库内部,有一个包含几列的customer表,因为行大小可以放在那里(到目前为止,超过1000列)。

MySQL ETL作业将信息放在此处,仅需要从无null值的列中获取数据。下图显示了前几个寄存器的一小部分:

因此,值得检查该字段中的所有寄存器是否至少仅具有一个数据。仅此一项数据就可以改变数据湖/数据仓库/报告服务输入的模型,可能占总人口的1%。由于这种情况,下面叫check_field_null的存储过程产生此行为。该存储过程使用PREPARE,EXECUTE以及DEALLOCATE语句来管理SQL动态。它将COUNT标量函数的结果存储在QN变量中。因此,有可能获得多少个寄存器是NULL值的值。

/*======================================================Classroom:    SQL Level 3Database:    cinemashop======================================================*/
use cinemashop;
drop procedure if exists check_field_null;set delimiter //create procedure check_field_null(col varchar(64), schemaname varchar(255), _tablename varchar(255), out QN int)
BEGINSET @sSQL = concat('SELECT  @N := COUNT(*) FROM ', schemaname, '.', _tablename , ' WHERE (', col, ' <=> NULL);');prepare stm from @sSQL;execute stm;set QN =@N;deallocate prepare stm;END
//set delimiter ;

下面的代码说明了上述功能的作用。关于customer_id字段,它表明存在值。

set @p = 0;
call check_field_null('customer_id', 'cinemashop', 'customer', @p); /* This field customer_id has NOT null values */ select @p;

另一方面,如果像这样的字段gender仅具有NULL值,则计数器将检查预期结果:

set @p = 0;
call check_field_null('gender', 'cinemashop', 'customer', @p);/* This field gender has null values */select @p;

最后,工作包括获取表中各列的字段名称。今天,它可能是一个数据结构,但是明天,它可能会按需更改,并且当然可以在那里显示NULL值。这种方式在称为cur_cs_customer的存储过程中使用了CURSOR技术。它仅在information_schema允许提取时才有效,因此,那里需要一些权限。请注意,Count_Null变量的使用方式与之前的p变量相同。同样,allcols变量将MYCOL变量中每列的所有字段存储为没有任何NULL值。

/*======================================================Classroom:    SQL Level 3Database:    cinemashopTable name:    customer======================================================*/
use cinemashop;
drop procedure if exists cur_cs_customer;set delimiter //create procedure cur_cs_customer(inout allcols varchar(255))
BEGINDECLARE Count_Null  int default 0;DECLARE initial INT DEFAULT 0;DECLARE MYCOL   char(64);DECLARE ch_done INT DEFAULT 0;DECLARE cs_cur1 CURSOR FOR SELECT C.COLUMN_NAMEFROM information_schema.COLUMNS CWHERE C.TABLE_SCHEMA = 'cinemashop' _AND C.TABLE_NAME ='customer';DECLARE CONTINUE HANDLER FOR NOT FOUND SET ch_done = true;open cs_cur1;read_cs_cur1:LOOPFETCH cs_cur1 INTO MYCOL;IF (ch_done ) THENLEAVE read_cs_cur1;END IF;IF NOT isnull(MYCOL) THENcall check_field_null(MYCOL, 'cinemashop', 'customer', Count_Null);if Count_Null = 0 then/* Only it includes fields with not null values */set initial = initial + 1;if initial = 1 thenSET allcols =  MYCOL;else                SET allcols  = concat( cast(allcols as char(255)), ',', MYCOL);end if;end if;END IF;END LOOP read_cs_cur1;close cs_cur1;select allcols;
END
//

放在一起,我们可以使用非交互式语句使用@my_args变量,例如所有没有NULL值的列中的string。

set delimiter ;
call cur_cs_customer(@my_args);
select @my_args;
set @stm = concat('SELECT ', @my_args, ' FROM cinemashop.customer;');
PREPARE stmt1 FROM @stm;
execute stmt1;
deallocate prepare stmt1;

进程运行时,将获得以下输出:

当然,可以使用动态SQL创建cur_cs_customer存储过程以供一般使用,但是稍后我们可能会检查此存储过程。我目前的目的只是获得第一解决方案。

兴趣点

MySQL不是我最喜欢的数据库引擎,但是由于使用Web开发中许多编程语言的简单性,许多大型网站都具有RDBMS。另外,我的工作重点是平台集成,其中cookbook有一些ETL、数据仓库、数据管道、数据湖、数据中心的任务,当然,还有用于数据挖掘和数据科学任务的数据库。

使用动态SQL获取具有非空字段的自定义表结构相关推荐

  1. oracle改表结构非空字段类型,oracle 表结构的非完全复制

    今天有同事在问 复制表的时候 会把表的 not null 属性也复制过来,而他要求对复制过来的字段不加not null 字段 SQL> desc DW_ACCOUNT 名称            ...

  2. [存储过程]sql server 中 统计一条记录中 非空 字段个数 ,并且计算它所占百分比

    integrity 是表中存放非空字段百分比 的字段 companyName 等字段是参与统计的成员 看代码 drop procedure update_company_intergrity ; cr ...

  3. SQL获取所有用户名,数据库名、所有表名、所有字段名及字段类型

    SQL获取所有用户名,数据库名.所有表名.所有字段名及字段类型2009-03-14 10:481.获取所有用户名:SELECT name FROM Sysusers where status='2' ...

  4. orika 映射非空字段_Orika:将JAXB对象映射到业务/域对象

    orika 映射非空字段 这篇文章着眼于使用Orika将JAXB对象映射到业务域对象. 本月初, 我使用基于反射的Dozer讨论 了相同的映射用例 . 在本文中,我假设需要映射相同的示例类,但是它们将 ...

  5. oracle 判断非空字段

    sql中判断非空不能用等号,因为null在sql中被看作特殊符号,必须使用关键字 is和not select * from A where info is not null 非空: select id ...

  6. 用SQL语句添加删除修改字段及一些表与字段的基本操作 .

    用SQL语句添加删除修改字段及一些表与字段的基本操作 分类: MS SQL 2009-07-02 14:41 222人阅读 评论(0) 收藏 举报 用SQL语句添加删除修改字段 1.增加字段      ...

  7. php中表单的非空验证,Javascript的表单与验证-非空验证_javascript技巧

    JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证. 表单提交前要检查数据的合法性 在要对表单里的数据进行验证的时候,可以利用getElementById()来 ...

  8. 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等

    用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段 ALTER TABLE table_NAME DROP CO ...

  9. django 使用原生SQL语句反向生成MODELS.PY中的表结构

    在一次工作中,有这么一个问题,就是要导入的数据字段不确定,但是还想使用django的ORM来对数据进行操作.. 琢磨了许久,弄个不完善的方案,但功能是能实现的,主要是思路.废话不多说了,丑陋的展示一下 ...

最新文章

  1. ML_Random_Forests
  2. ant 合并 jar
  3. 我是如何学习写一个操作系统(四):操作系统之系统调用
  4. word可以直接导入mysql嘛_如何把word文档导入到数据库中——java POI
  5. 2020国货品牌力发展报告
  6. docker anaconda_深度学习炼丹炉配置[1] Docker+sshfs环境配置
  7. python自学教程-python怎么快速自学?
  8. 印象笔记电脑版使用技巧_苏江:打造你的第二大脑,印象笔记的5个超级使用技巧...
  9. Qt中一个.cpp类的函数调用另一个.cpp中类的函数的方法
  10. sysctl.conf文件配置详解
  11. 医院绩效考核系统设计方案
  12. java通过TscLibDll调用佳博热敏票据打印机(580130IVC)打印小票
  13. 网站点击数字翻页html代码,html5数字翻页时钟代码
  14. Winform调用风云二号卫星云图(更改后版本)
  15. Gradle基础教程
  16. web端实现二维码扫码记录
  17. 优化 | 运筹学:从入门到毕业
  18. 华盛顿道格拉斯县计划建立区块链创新园区
  19. 基于SSM大学生宿舍交电费系统
  20. 6iypl8php,无线超方便 YPL TL-1/TL-3蓝牙音箱新品上市

热门文章

  1. java文件怎么一行一行读,Java 读文件内容如何显示在一行上
  2. pythonnumpy矩阵详解_python常用模块numpy解析(详解)
  3. 高甜预警|甜齁你的情人节促销海报设计模板
  4. mysql 实现计数器_MySQL实现计数器的表设计及实现
  5. wampserver3.2.0_MySQL 8.0 技术详解
  6. java 网络实验_20145220 实验五 Java网络编程
  7. C++ Vector详解
  8. 正确的修改web项目的名字
  9. CALLING PROCEDURES USING CALL AND RET
  10. 关于布隆过滤器的所有信息:利用Hash实现的索引方案