目录

介绍

背景

使用代码

兴趣点


我如何才能从查询中获取非空字段?是的,您可以使用现代的编程语言轻松完成此操作,但是通过从表中获取冗余信息可能会浪费资源,而且很多时候,它可能会添加冗余代码。从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. 采用CSS+JS实现简洁的滑动导航栏_网页代码站(www.webdm.cn)
  2. paho mqtt client调试记录
  3. python定时发送邮件_Python3实现带附件的定时发送邮件功能
  4. 对jquery的conflict方法的解读
  5. Nutanix企业云助力嘉里大通提升核心竞争力
  6. cisco 热备份路由器协议HSRP笔记
  7. CentOS下yum操作gnome和kde桌面
  8. pythonopencv测距_python opencv单目测距 小孔成像原理
  9. Go 神坑 1 —— interface{} 与 nil 的比较
  10. 简单的达梦数据库使用DISTINCT去重
  11. linux jupyter 远程,Linux下远程访问Jupyter Notebook 配置
  12. wx-微信公众号-静默登陆授权
  13. 深入 CoreML 模型定义
  14. findfont: Font family [‘sans-serif‘] not found解决方法
  15. 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。(java)
  16. mysql关于xsd数据集的论述
  17. 薛兆丰经济学课 1-1 人性与稀缺:经济学视角
  18. 不只为生活服务 物联网助力南极科研考察
  19. 公考复盘(一)——第三季第四季
  20. Linux的 常用命令

热门文章

  1. mysql数据库做关联查询_mysql 数据库join关联查询using(xxx)的作用
  2. 网站数据是怎么存取在mysql_数据是怎么存储在mysql?
  3. python获取命令行参数_Python获取命令行参数的正确方法,案例详解
  4. 背景素材|令人惊讶水彩背景,新尝试
  5. 电商页面设计排版没有思路?可临摹PSD分层模板,诠释基础版式大招帮你轻松搞定!
  6. ad中电容用什么封装_【AD封装】VH3.96mm插件座子(带3D)
  7. java 网络实验_20145220 实验五 Java网络编程
  8. 频谱分析幅值单位_FFT分析的注意事项,您都知道吗?
  9. C++实现复制文本粘贴文本功能
  10. Linux内核深入理解定时器和时间管理(7):相关的系统调用