背景以及场景

我们知道SQL中有一个非常便利的操作:

SELECT *

FROM TABLE_NAME

这样可以选择出表中所有的列,而不用一个个列出来。虽然这个从性能角度是有很大问题的,但是架不住它方便,所以被广泛使用。

以及延展的快速加个新列都很方便:

SELECT *, 1 AS new_column

FROM TABLE_NAME

但是,无论在SQL标准中,还是在绝大多数数据库中,有一类日常很容易出现的场景在SQL中却比较难支持:

  1. 从所有列中去除某一列

  2. 从所有列中只更新某一列,这个和“去除一列”是一类问题

这时,我们一般会是从数据库中查出该表所有的列,手工去掉某一列, 然后在查询时明确指定所需的列,比如:对于前文中的“customers”表:

id customer_id product_id unit unit_price discount
1 1 1 10 10 0.2
2 1 2 5 50 0.3
3 2 1 8 15 0.2
4 3 3 22 15 0.1

我们要去掉 discount 列,我们需要写SQL为:

SELECT id,

customer_id,

product_id,

unit,

unit_price

FROM customers

也许有人说:明确列出所有列更清晰也性能更好,不过在日常使用中确实不方便,因为:

  1. 数仓中,经常有某些表有非常多列(300+列)的情况,尤其是有不少数据库因为性能和避免JOIN都推荐用“大宽表”的形式,真的把这些表的列名列出来真的好繁琐。也许你熟练 EMACS 等编辑器神器,可以用其中的 KeyboardMacros 等秘技来简化文本操作,但是还是非常不方便和容易出错。

  2. 尤其是SQL比较复杂后(比如前文中的意大利面式SQL),往往这些列的列表会出现在多个地方,这时候要是万一底层表多了一列,那这列非常难扩散到SQL最终结果中。

少数几个数据库的解决方案

Google BigTable 支持 "SELECT * EXCEPT" 和 “SELECT * REPLACE”

参考 Google BigQuery 的语法:

https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax

可以用

SELECT * EXCEPT discount

FROM customers

来快速去掉列。

而用

SELECT * REPLACE (0.8 * discount) AS discount

FROM customers

来对 discount 列进行更新

从这点来说,Google BigQuery 的查询确实挺人性化, 但是遗憾的是 Google BigQuery 对国人来说基本上等同于“不存在”。

Apache Spark 的方式

Spark SQL不光是能支持直接使用SQL的形式,还能直接Python/Scala/Java等调用其 Dataset API,那就可以用:

df.drop("discount")

来删除列

而用

df.withColumn("discount",

functions.expr("0.8 * discount"))

来重命名

可是其它大多数数据库不支持(比如:Postgresql)

对于非 Google BigQuery 数据库,程序来帮忙

如果我们采取前文中的借助程序来做

YAML文件 (包含了各个小的逻辑SQL) -> 面向机器的SQL

的转化的话,那么,我们可以额外增加一些非SQL操作节点, 比如:

Steps:

- name: step_filter_customer1

comment: 过滤掉非法客户

sql: |-

SELECT *

FROM customers

WHERE customers.is_delete=False

- name: step_update_distinct

type: SELECT_ALL_REPLACE

from: step_filter_customer1

columns:

- column: discount

expr: 0.8 * discount

- name: step_drop_distinct

type: SELECT_ALL_EXCEPT

from: step_update_distinct

columns:

- "distinct"

那我们的转换程序就可以额外多做一点处理,通过程序读取出之前表的所有列, 这样当执行 SELECT_ALL_REPLACESELECT_ALL_EXCEPT 时,就可以提人工去实现 Google BigQuery 的 “SELECT * REPLACE” 和 “SELECT * EXCEPT” 了。

讨论SQL的弱点,不是说SQL不好,而是为了SQL更好!

sql将一列拆分为多列_SQL的弱点(2):不支持从所有列中去除某列相关推荐

  1. sqlserver 插入数据时异常,仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'XXXXX.dbo.XXXXXXXXX'中的标识列指定显式值。...

    INSERT INTO XXXXXXXXX.dbo.XXXXXXXXX select * from XXXXXXXXX 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'X ...

  2. sqlserver2005仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表 'SendMealAddress'中为标识列指定显式值。...

    ps = con.prepareStatement("insert into SendMealAddress values(null,?,?,?,?)"); 表有一列是自增长的标识 ...

  3. Excel·VBA按列拆分工作表、工作簿

    改进<将excel按照某一列拆分成多个文件>,使代码更具通用性,可以实现将工作表拆分为工作表或工作簿 对Excel表格数据按照某列的值,将工作表拆分 目录 1,工作表按列拆分为工作表 2, ...

  4. PostgreSQL中生成的列

    目录 介绍 背景 PostgreSQL 12 与SQL Server计算列比较 那么,生成的列与带有DEFAULT子句的常规列有何不同? 局限性 其他注意事项 PostgreSQL 11.x及更高版本 ...

  5. mysql数据表中取几列_MySQL查询数据表中数据记录(包括多表查询)

    MySQL查询数据表中数据记录(包括多表查询) 转自:http://www.baike369.com/content/?id=5355 在MySQL中创建数据库的目的是为了使用其中的数据. 使用sel ...

  6. Microsoft Excel 教程:如何在 Excel 中插入或删除行和列?

    欢迎观看 Microsoft Excel 教程,小编带大家学习 Microsoft Excel 的使用技巧,了解如何在 Excel 中插入或删除行和列.插入和删除行和列以更好地组织工作表. 插入或删除 ...

  7. Word控件Spire.Doc 【Table】教程(17):如何在 C#、VB.NET 中删除 Word 表格中的行和列

    Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库.在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建.编辑.转换和打印 Micr ...

  8. 浅析SQL Server数据库中的伪列以及伪列的含义

    浅析SQL Server数据库中的伪列以及伪列的含义 原文:浅析SQL Server数据库中的伪列以及伪列的含义 本文出处:http://www.cnblogs.com/wy123/p/6833116 ...

  9. python 列表多行_Python Pandas list列表数据列拆分成多行的方法实现

    1.实现的效果 示例代码: df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]}) df Out[458]: A B 0 1 [1, 2] 1 2 [1, 2] ...

最新文章

  1. ACL-文件访问控制列表
  2. 【linux】spinlock 的实现
  3. spark 历史版本下载地址
  4. Java解析JSON文件
  5. 如何拆计算机主机箱,一种方便拆卸的计算机主机箱的制作方法
  6. 海外精致办公名片展示样机|智能贴图 Mockup名片模板
  7. 子公司倒戈,CEO 遭攻击,股价暴跌,迅雷内讧事件的三个教训
  8. python文件目录无权限_python检查目录文件权限并修改目录文件权限的操作
  9. python包裹和运费_使用shopifyapipython,添加新产品并注明价格和“需要运费”:Fals...
  10. mysql5.5.53安装教程_mysql5.5.28安装教程 超详细!
  11. JS控制DIV的显示隐藏 。js中radio的取值 。JS控制select的方法(摘取)。js 控制表单中SELECT
  12. c语言常用例子,C语言经典例子100个
  13. UI库colorui的使用————小程序
  14. 无忧代理免费ip爬取(端口js加密)
  15. Mac修改登陆界面背景图片,开机登陆界面,替换沙漠背景图 @macOS Mojave - 10.14.x
  16. matlab粒子群运动模拟伪代码,基本粒子群优化算法(PSO)的matlab实现
  17. 同位语从句 vs 定语从句 区别
  18. 苹果:付费才能用 iOS 开发者预览版,网友吐槽:找 Bug,还得先交 99 美元?
  19. html5音频文件生成波形图代码,使用wavesurfer.js显示mp3 audio音频的波形图
  20. python 自动记录时间_python记录程序运行时间的几种方法

热门文章

  1. 大话中文文本分类之前数据处理
  2. 从源码分析DEARGUI之add_text_point
  3. 入门|机器学习中常用的损失函数你知多少?
  4. spring各版本jar包和源码
  5. Mysql show Status参数详解
  6. 《Learning Scrapy》(中文版)第11章 Scrapyd分布式抓取和实时分析
  7. Java最全文件操作实例汇总
  8. Debain/ArchLinux/Gentoo 等将合并为超级Linux
  9. sql2005 Agent XPs 选项释义
  10. java中toString的使用