BI-SQL丨XML

XML

SQL Server中,存在一种特殊类型的数据,就是XML数据类型。

可能看到这里,小伙伴都会产生疑惑,XML不是Web语言么?为什么在SQL Server里面也会有XML数据类型?

这个就要从SQL Server的应用开始说起了,众所周知,SQL作为计算机的通用语言之一,在各个领域都存在广泛的应用,也有着各式各样的开发规范要求,但是并不是所有的场景下,开发者都会遵循相关的规范。

这就导致,不同的开发者之间因为开发习惯不同,导致接口之间的对接,存在很大的问题。

例如:小A开发了总部的数仓,某张表一共16个字段;小B开发了分部的数仓,因为分部的业务特色,导致小B开发的某张表多余16个字段;这种情况下,小A和小B之间接口的对接,就会出现很大的差异性。

为了解决这一现状,SQL Server引入了XML类型的字段,这样不需要针对表结构进行更改,可以将差异化类型的数据,存储在XML类型的字段中。

使用实例

例子1:使用query和value查询XML数据。

创建一张表,包含XML类型的数据。

代码如下:

CREATE TABLE XML_TEST1
(
    XMLID INT PRIMARY KEY,
    XMLVALUE XML NOT NULL
)
GO
;


INSERT INTO XML_TEST1
    (XMLID,XMLVALUE)
VALUES
    (1, N'<title>白茶</title><title>黑茶</title>'),
    (2, N'<title>红茶</title>'),
    (3, N'<price>19</price>'),
    (4, N'<price>18</price>'),
    (5, N'<sku>tea</sku>');

我们来看一下数据结果:

针对XML的数据类型,SQL Server是有专门的查询关键字的,分别是query查询和value查询。

query查询返回的是原始的数据格式,而value查询可以从XML中提取相应的值。

query查询示例:

SELECT XMLVALUE.query('/title') FROM XML_TEST1

结果如下:

注:
query内的字段,为查询条件,即获取XML中数据标签。

value查询示例:

SELECT XML_TEST1.XMLVALUE.value('(/title)[1]', 'nvarchar(max)') AS A1,

结果如下:

注:
1.同query查询一样,value第一参数里面的字段,也是查询条件;
2.value查询条件里面的[1],代表获取数据的位置;

例子2:使用nodes查询XML数据。

创建一张表,包含XML类型的数据。

代码如下:

CREATE TABLE XML_TEST2
(
    XMLID INT PRIMARY KEY,
    XMLVALUE XML NOT NULL
)
GO
;


INSERT INTO XML_TEST2
    (XMLID,XMLVALUE)
VALUES
    (1, N'<title>白茶</title><title>黑茶</title><title>红茶</title>'),
    (2, N'<title>黄茶</title>'),
    (3, N'<title>蓝茶</title>'),
    (4, N'<title>绿茶</title>');

我们来看一下数据结果:

nodes通常会返回XML数据类型中,符合条件的多个节点数据组合成的多行一列的结果表。

这句话很抽象,我们点击上面的查询结果的第一行,结果如下:

可以看到,实际上在结果的第一行,是存在多行数据的,而nodes的作用通常是将一行中多行的数据,拆分出来。

说到这里,就需要提到另外两种形式的APPLY了。

CROSS APPLY与OUTER APPLY

语法:

<left_table_expression>  {cross|outer} apply <right_table_expression>

APPLY运算的步骤:
1.A1:把右表表达式(<right_table_expression>)应用到左表(<left_table_expression>)输入的行;
2.A2:添加外部行;
3.使用APPLY先计算左输入,然后为左输入中的每一行计算一次右输入。

CROSS APPLY和OUTER APPLY,都会执行A1,进行左右表匹配,而只有OUTER APPLY会执行A2。

简而言之:
如果左表匹配到右表,有空积时,CROSS APPLY空积会被过滤;
反之,OUTER APPLY返回的结果包含空积。
为什么这里会提到这两个APPLY,因为nodes通常会和这两个APPLY搭配使用。

CROSS APPLY查询示例:

SELECT
    XML_TEST1.XMLID,
    T2.C.value('.', 'NVARCHAR(MAX)') AS XMLVALUE
FROM XML_TEST1
  CROSS APPLY XMLVALUE.nodes('/title') AS T2(C)

结果如下:

OUTER APPLY查询示例:

SELECT
    XML_TEST1.XMLID,
    T2.C.value('.', 'NVARCHAR(MAX)') AS XMLVALUE
FROM XML_TEST1
  OUTER APPLY XMLVALUE.nodes('/title') AS T2(C)

结果如下:

从结果上,相信小伙伴也能看出差异,这里白茶给大家解释一下:

在XML_TEST1中,一共有5行数据,只有2行,有title标签,而title标签的2行数据,可以拆分出来白茶、黑茶、红茶共计3行数据。
CROSS APPLY会过滤掉空积,因为左右表有3行数据不匹配,所以返回匹配上的3行数据。
OUTER APPLY不过滤空积,原表有5行数据,拆分之后数据总数为6行,所以返回6行数据。

例子3:利用XML的语法,针对某个分隔符进行拆分。

创建一张数据表。

CREATE TABLE XML_TEST3
(
    XMLID INT PRIMARY KEY,
    XMLVALUE NVARCHAR(200) NOT NULL
)
GO
;


INSERT INTO XML_TEST3
    (XMLID,XMLVALUE)
VALUES
    (1, N'白茶,黑茶,红茶'),
    (2, N'黄茶,紫茶'),
    (3, N'蓝茶'),
    (4, N'绿茶');

我们来看一下结果:

我们现在,要针对XMLVALUE字段,对分隔符“,”进行拆分。

SELECT 
ReplaceTable.XMLID, 
T2.C.value('.', 'NVARCHAR(MAX)') AS XMLVALUE
FROM
    (SELECT XMLID, 
          CAST('<TEA>'+REPLACE(XMLVALUE,',','</TEA><TEA>')+'</TEA>' AS XML) AS XMLVALUE
    FROM XML_TEST3) AS ReplaceTable
OUTER APPLY ReplaceTable.XMLVALUE.nodes('/TEA') AS T2(C)

结果如下:

解释一下:
1.使用CAST函数,将原本的分隔符替换为一个固定的XML标签,并且将其转化为XML数据格式;
2.使用XML中的nodes函数,将转化后的XML数据类型字段进行行拆分,生成一张多行一列的结果表;
3.OUTER APPLY将转化后事实表,与nodes生成的结果表,进行左右关联;
4.使用XML中的value函数,将转化后的XML数据类型字段中的值提取出来。

这里是白茶,一个PowerBI的初学者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/41881.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaSwing+MySQL的酒店管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88063706?spm1001.2014.3001.5503 JDK1.8、MySQL5.7 功能&#xff1a;散客开单&#xff1a;完成散客的开单&#xff0c;可一次最多开5间相同类型的房间。 2、团体开单&#xff1a;完成团体…

photoshop制作法线和凹凸贴图

做个选区 Ctrlj 法线贴图 生成凹凸贴图

如何避免在C#中出现混乱代码

文章目录 一、溯源&#xff1a;混乱代码出现的原因 二、陷阱&#xff1a;混乱代码会使你焦头烂额 三、10招&#xff1a;避免出现混乱代码 四、写在最后&#xff1a;不与混乱代码纠缠 意大利面是一种很好吃的食物&#xff0c;但是&#xff0c;如果用它来形容代码意味着这种程…

伙伴云CEO戴志康:我们为什么要做伙伴云?

分享嘉宾&#xff1a;戴志康&#xff0c;伙伴云CEO 以下为演讲实录⬇⬇⬇ 01选择人更少的一条路&#xff0c;从B级走向A级 我一直想和大家交流一个话题&#xff0c;关于我们为什么要做伙伴云。既代表我自己&#xff0c;同时也代表我们团队的一些想法。 我是一个怀疑论者。大…

centos7.6下安装mysql

1.下载yum源&#xff1a; wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm2.执行安装&#xff1a; rpm -ivh mysql80-community-release-el7-5.noarch.rpm3.开始安装 yum install -y mysql-server4.启动mysql服务 systemctl start mysqld5.查看…

Docker 应用容器引擎

Docker 应用容器引擎 一、Docker是什么二、Docker安装和查看1、docker安装2、docker版本信息查看3、docker信息查看 三、镜像操作四、容器操作1、容器创建2、创建并启动容器3、容器的进入4、复制5、容器的导入和导出6、删除容器 一、Docker是什么 是一个开源的应用容器引擎&…

【自监督预训练 2023】MCL

【自监督预训练 2023】MCL 论文题目&#xff1a;Multi-Level Contrastive Learning for Dense Prediction Task 中文题目&#xff1a;稠密预测任务的多级对比学习 论文链接&#xff1a;https://arxiv.org/abs/2304.02010 论文代码&#xff1a;https://github.com/GuoQiushan/MC…

i.MX6Q应用处理器:MCIMX6Q5EYM12AD/MCIMX6Q5EYM10AE/MCIMX6Q5EYM10ADR 4核、32位,624-LFBGA

i.MX6Q 处理器代表了集成多媒体应用处理器的最新成就。这些处理器是不断增长的多媒体产品系列的一部分&#xff0c;这些产品提供高性能处理&#xff0c;并针对最低功耗进行了优化。 i.MX6Quad处理器采用先进的四核ArmCortex-A9内核&#xff0c;运行速度高达1.2 GHz。它们包括2…

浏览器打开PDF标题乱码

问题 使用 itext5 用pdf模板生成预览pdf乱码问题 解决办法 使用pdf编辑器打开之后&#xff0c;选择 文件>> 属性&#xff0c; 修改乱码的标题。

ENSP实验一:防火墙基础配置

1、搭建拓扑图 配置client&#xff08;内网&#xff09;、FTP Server&#xff08;外网&#xff09;的IP地址 客户端设置&#xff1a; 服务端设置&#xff1a; 2、配置防火墙命名 进入防火墙&#xff0c;输入密码&#xff1a;默认为admin123 <USG6000V1>system-view /…

linux 安装pytorch3d的坑

事实上&#xff0c;只要按照官方文档的说明就可以完美安装。其中坑的地方在于conda的管理可能会导致下载的版本不符合你的要求&#xff08;例如下载成了cpu版本、下载的cuda版本&#xff09;而同样尝试使用源码编译以及其他方式下载库都会导致同样的问题&#xff0c;这里主要的…

Centos 7 使用国内镜像源更新内核

内核选择参考 此博文 &#xff1a;https://blog.csdn.net/alwaysbefine/article/details/108931626 elrepo官网介绍的内核升级方式为&#xff1a; 一、按文档执行引入 elrepo库&#xff1b; # 1、引入公钥 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org# 2、安…

回归预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于SVM-Adaboost支持向…

left join 和except方法区别和联系

目录 相同点&#xff1a; left join except 不同点 假设有两个表&#xff1a;A客户表 和 B客户表&#xff0c;客户uid是唯一主键 相同点&#xff1a; 查询在A中的客户 但不在B中&#xff0c;也就是图中的阴影部分&#xff0c;left join 和except方法都可以实现 left join …

torch分布式通信基础

torch分布式通信基础 1. 点到点通信2. 集群通信 官网文档&#xff1a;WRITING DISTRIBUTED APPLICATIONS WITH PYTORCH 1. 点到点通信 # 同步&#xff0c;peer-2-peer数据传递 import os import torch import torch.distributed as dist import torch.multiprocessing as mpdef…

CSS:给子元素设置了浮动,页面缩放的时候,子元素往下掉

前言 给子元素设置了浮动&#xff0c;页面缩放的时候&#xff0c;子元素往下掉 html代码&#xff1a; <div class"father"><div class"child1"></div><div class"child2"></div> </div>css代码 .child1…

动态内存管理(C语言)

动态内存管理 1. 为什么存在动态内存管理2. 动态内存函数的介绍2.1 malloc函数和free函数2.2 calloc函数2.3 realloc函数 3. 常见的动态内存错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free函数3.4 使用free释放动态开辟内存的一部分…

旅游卡小程序软件招商加盟代理

旅游卡小程序软件招商加盟代理 我国人民生活水平的提高&#xff0c;旅游业成为了人们生活中必不可少的一部分。旅游卡小程序软件作为旅游行业的重要组成部分&#xff0c;也日益受到人们的关注。如今&#xff0c;旅游卡小程序软件招商加盟代理已经成为了一个热门的投资创业项…

详解c++---特殊类设计

目录标题 设计一个不能被拷贝的类设计一个只能从堆上创建对象的类设计一个只能在栈上创建对象的类设计一个无法被继承的类什么是单例模式饿汉模式饿汉模式的缺点懒汉模式懒汉模式的优点懒汉模式的缺点特殊的懒汉 设计一个不能被拷贝的类 拷贝只会放生在两个场景中&#xff1a;…

Jmeter+Maven+jenkins+eclipse搭建自动化测试平台

背景&#xff1a; 首先用jmeter录制或者书写性能测试的脚本&#xff0c;用maven添加相关依赖&#xff0c;把性能测试的代码提交到github&#xff0c;在jenkins配置git下载性能测试的代码&#xff0c;配置运行脚本和测试报告&#xff0c;配置运行失败自动发邮件通知&#xff0c…