第九周翻译

t - sql的阶梯:超越基础水平6:使用表达式和IIF函数

通过格雷戈里·拉森,2016/04/20(第一次出版:2014/04/09)

该系列

本文是楼梯系列的一部分:楼梯t - sql:除了基础知识

从他的t - sql DML楼梯后,格雷戈里·拉森涵盖了更高级的子查询等方面的t - sql语言。

有时,你需要写一个TSQL语句能够返回不同TSQL表达式基于另一个表达式的评价。 当你需要这种功能可以使用表达式或IIF函数来达到这个要求。 在本文中,我将回顾这一案件,IIF语法和显示你如何表达和IIF函数的例子。

理解这样表达

transact - sql例表达式允许你在TSQL放置条件逻辑代码。 这条件逻辑提供了一种不同的可执行代码块在你TSQL语句根据条件逻辑或真或假的评价。 您可以将多个条件表达式的一个表达式。 当你在条款中,有多个条件表达式值为TRUE的第一个表达式将评估你的TSQL语句的代码块。 为了更好地理解如何表达作品我将审查情况下表达的语法,然后经过许多不同的例子。

情况下表达式语法

这样表达有两个不同的格式:简单搜索。 每一种类型都有一个稍微不同的格式如图1所示。

简单的案例表达:案例input_expression

当when_expression result_expression[… n]

(其他else_result_expression)

结束搜索案例表达:情况下

当Boolean_expression result_expression[… n]

(其他else_result_expression)

结束

图1:表达式语法

通过回顾情况下表达的两种不同的格式在图1中可以看到每个格式提供了一种不同的方式来识别一个多个表达式,确定情况下表达的结果。 有两种类型的情况下,一个布尔测试时为每个条款执行。 对这个简单的例子表达左手边的布尔测试后出现的话,叫做“input_expression”,和右手站后的布尔测试是正确的单词时,称为“当表达式”。 对这个简单的例子表达之间的运算符“input_expression”和“when_expression”总是相等操作符。 而搜索情况下表达每个当条款将包含一个“Boolean_expression”。 这种“Boolean_expression”可以是一个简单的布尔表达式用一个运营商,与许多不同的条件或一个复杂的布尔表达式。 此外,搜索情况下表达式可以使用布尔操作符的全套。

不管这种情况下使用格式,每个条款的顺序比较的时候出现。 案件的结果表达式时将根据第一条款评估为TRUE。 如果没有当其他子句的计算结果为真时,则返回表达式。 时省略其他条款和条款评估为TRUE,然后返回一个NULL值。

样本数据的例子

为了有一个表来演示使用情况下表达我将使用清单1中的脚本创建一个示例表命名MyOrder。 如果你想跟随我的例子,在您的SQL服务器实例上运行它们可以创建这个表在数据库中。

创建表MyOrder(

int ID身份,

OrderDT日期,

OrderAmt小数(10,2),

分期预付char(1));

插入MyOrder值

(‘ 12-11-2012 ‘,10.59,NULL),

200.45(‘ 10-11-2012 ‘,‘ Y ‘),

(‘ 02-17-2014 ‘,8.65,NULL),

(‘ 01-01-2014 ‘,75.38,NULL),

(‘ 07-10-2013 ‘,123.54,NULL),

(‘ 08-23-2009 ‘,99.99,NULL),

350.17(‘ 10-08-2013 ‘,‘ N ‘),

(‘ 04-05-2010 ‘,180.76,NULL),

(‘ 03-27-2011 ‘,1.49,NULL);

清单1:MyOrder创建示例表

用一个简单的案例表达和其他表情

演示如何简单的案例表达格式工作让我运行清单2中的代码。

选择一年(OrderDT)OrderYear,

例年(OrderDT)

当2014年“第一年”

当2013年之后的第二年

当2012年“三年级”

其他4年和超越YearType结束

从MyOrder;

清单2:简单的表达式与其他表达式

让我先谈谈为什么这是一个简单的表达式。 如果你回顾清单2中的代码后你可以看到我指定表达式”这个词(OrderDT)”,然后我跟着,通过三种不同当表达式指定每一个拥有不同的一年,从2014年开始。 因为我指定的表达式之间的情况,第一个当关键字告诉SQL服务器,这是一个简单的表达式。

当我的简单的情况下计算表达式它使用相等操作符(" = ")之间的“年(向数据库)“价值和不同的表达式。 因此,清单1中的代码将显示”第一年”YearType行与列OrderDT年的价值”2014年”,或者它将显示“第二年“行了OrderDT年的“2013年”或它将显示”三年级“行了OrderDT年的“2012”。 如果今年的OrderDT不匹配的任何表达式然后其他条件时将显示“年4和超越”。

当我运行清单2中的代码1所示的输出结果。

OrderYear YearType

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

2012年3

2012年3

2014年1

2014年1

2013年2

2009年及以后

2013年2

2010年及以后

2011年及以后

结果1:当运行清单2所示的结果

使用一个简单的表达式没有其他表达式

让我运行清单3中的代码将显示一个简单的案例表达时会发生什么没有一个ELSE子句。

选择一年(OrderDT)OrderYear,

例年(OrderDT)

当2014年“第一年”

当2013年之后的第二年

当2012年“三年级”作为YearType结束

从MyOrder;

清单3:简单的案例表达没有其他条款

清单3中的代码就像清单2中代码但没有一个ELSE子句。 当我运行清单3中的代码产生结果2所示的结果。

OrderYear YearType

- - - - - - - - - - - - - - - - - - - - -

2012年3

2012年3

2014年1

2014年1

2013年2

2009年零

2013年2

2010年零

2011年零

结果2:当运行清单3的结果

通过评审的输出结果2中可以看到,当今年的OrderDT在MyOrder表不符合条款条件时的任何SQL Server为YearType值显示“零”这一行。

使用一个搜索表达式

在简单的情况下表达基于相等操作符表达式进行评估。 的搜索表达式可以使用其他运营商,和表达式语法有点不同。 证明这个让我们来看看清单4中的代码。

选择一年(OrderDT)OrderYear,

情况下

当(OrderDT)= 2014年的第一年

当(OrderDT)= 2013年的第二年

当(OrderDT)= 2012年“三年级”

当一年(OrderDT)< 2012年4和超越的

作为YearType结束

从MyOrder;

清单4:搜索表达式

如果你看看清单4中的代码时,你可以看到情况后直接遵循条款没有文本之间的两个条款。 这告诉SQL Server这个搜索表达式。 还要注意每个当条款后的布尔表达式。 正如你所看到的并不是所有的这些布尔表达式使用相等操作符,最后当表达式使用小于(<)算子。 清单4中的情况下表达逻辑与清单2中的表达情况。 因此当我运行清单4中的代码会产生相同的结果,结果1所示。

如果多个表达式返回当表达式计算为TRUE ?

可能会有不同的情况下当表达式计算为TRUE在单一情况下的表达式。 这时SQL服务器将返回结果表达式与第一个当表达式计算为true。 因此当从句的顺序将控制你会返回什么结果你的案子表达式时如果多个条款评估为TRUE。

展示我们用这样的表情来显示”200美元的订单“当OrderAmt在200美元的范围之内。”100美元的订单“当OrderAmt是100美元的范围内“< 100美元的订单“当OrderAmt小于100美元当一个OrderAmt不属于任何的这些类别分类的顺序为“300美元以上的订单”。 让我们回顾一下清单5中的代码演示当多个当表达式计算为TRUE时向其中一个订单进行分类OrderAmt_Category值。

选择OrderAmt,

情况下

当OrderAmt < 300 300美元订单

当OrderAmt < 200 200美元订单

当OrderAmt < 100 < 100美元订单

其他的300美元以上的订单

作为OrderAmt_Category结束

从MyOrder;

清单5:在多个例子当表达式计算为TRUE

当我运行清单5中的代码得到输出结果3。

OrderAmt OrderAmt_Category

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

10.59 200美元订单

200.45 200美元订单

8.65 200美元订单

75.38 200美元订单

123.54 200美元订单

99.99 200美元订单

350.17 300美元以上的订单

180.76 200美元订单

1.49 200美元订单

结果3:当运行清单5所示的结果

通过回顾结果3中的结果可以看到,每个订单都是报道200或200以上的订单,我们知道这是不正确的。 这是因为我只用不到(“<”)操作符简单地分类订单导致多个当表达式计算为TRUE在我的例子中表达。 当从句的顺序不允许返回正确的表达式。

通过重建创造条件条款时我可以得到我想要的结果。 清单6中的代码清单5是一样的但我有重新定购商品当条款正确分类我的命令。

选择OrderAmt,

情况下

当OrderAmt < 100 < 100美元订单

当OrderAmt < 200 200美元订单

当OrderAmt < 300 300美元订单

其他的300美元以上的订单

作为OrderAmt_Category结束

从MyOrder;

清单6:类似的代码如清单5,但当条款以不同的顺序

当我运行清单5中的代码得到输出结果4。

OrderAmt OrderAmt_Category

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

10.59 < 100美元的订单

200.45 200美元订单

8.65 < 100美元的订单

75.38 < 100美元的订单

123.54 100美元订单

99.99 < 100美元的订单

350.17 300美元以上的订单

180.76 100美元订单

1.49 < 100美元的订单

结果4:当运行清单6所示的结果

检查输出结果4中,您可以看到,通过改变当表达式的顺序为每个订单我得到了正确的结果。

嵌套情况下表达式

偶尔你可能会需要额外的测试使用情况进一步分类数据的表达式。 当你可以用一个嵌套的情况下发生的表达式。 清单7中的代码显示了一个示例的嵌套表达式进一步分类订单MyOrder表来确定订单购买使用分期预付当订单价值超过200美元。

选择OrderAmt,

情况下

当OrderAmt < 100 < 100美元订单

当OrderAmt < 200 200美元订单

当OrderAmt < 300

情况下

当礼物= ‘ N ‘

然后200美元订单没有礼物的

其他与分期预付200美元订单结束

其他的

情况下

当礼物= ‘ N ‘

然后300美元订单没有礼物的

其他与分期预付300美元订单结束

作为OrderAmt_Category结束

从MyOrder;

清单7:嵌套语句

清单7中的代码类似于清单6中的代码。 唯一的区别是我添加了一个额外的情况下表达是否有秩序MyOrder表购买使用礼物选项,只允许购买超过200美元。 记住当你窝案表达式SQL服务器只允许有10的嵌套级别。

可以使用其他地方的表达

到目前为止,我所有的示例使用表达式创建一个结果字符串通过将选择列表的情况下表达TSQL select语句。 您还可以使用一个案例表达在一个更新,删除和设置语句。 另外这样表达可以结合使用,在那里,ORDER BY和条款。 在清单8中,我使用一个案例表达一个WHERE子句。

SELECT *

从MyOrder

情况下一年(OrderDT)

当2014年“第一年”

当2013年之后的第二年

当2012年“三年级”

其他4和超越的结束=“1年”;

清单8:在WHERE子句中使用情况下表达

在清单8中我只想返回的订单MyOrder表中的行“第一年”。 为此我把相同的情况下表达我在WHERE子句中使用清单2中。 我用条件表达式的左边部分,所以它会产生不同的基于“…年”字符串OrderDT列。 然后我测试产生这样的字符串表达式是否等于“1年”的价值,一行的时候将会回来MyOrder表。 记住我不建议使用案例表达选择日期的日期列使用“1年”这样的刺痛,当有其他更好的方法,如使用一年对于一个给定的函数选择行。 我只有这样做来演示如何使用一个CASE语句的WHERE子句。

简化表达式使用IIF函数

与SQL Server 2012的引入,微软添加IIF函数。 IIF函数可以被认为是一个快捷方式到CASE语句。 在图2中您可以找到IIF的语法功能。

国际金融协会(boolean_expression true_value false_value)

图2:IIF的语法功能

“Boolean_expression”是一个有效的布尔表达式,相当于真或假。 当布尔表达式等同于真实价值然后执行“true_value”表达式。 如果布尔表达式相当于假“false_value”执行。 就像这样表达IIF函数可以嵌套10水平。

使用IIF的例子

演示如何使用IIF函数替换表达式中,让我们来回顾一下的代码使用一个搜索表达式在清单9中。

选择OrderAmt,

情况下

当OrderAmt > 200美元高阶的

其他低美元订单的最终订单类型

从MyOrder;

清单9:简单表达式的例子

清单9中的代码时只有一个表达式,用于确定OrderAmt要么是高或低美元的订单。 如果当表达“OrderAMT > 200”真的,那么评估订单类型值设置为“高美元的秩序”。 如果当表达式的求值结果为FALSE,那么“低美元秩序”设置的订单类型价值。

重写代码使用一个IIF函数而不是表达在清单10中可以找到。

选择OrderAmt,

国际金融协会(OrderAmt > 200年,

“高美元订单”,

“低美元订单”)作为订单类型

从MyOrder;

清单10:使用IIF函数示例

清单10通过观察可以看到为什么IIF函数被认为是速记版本的情况下表达。 情况下被替换为”一词IIF(”字符串,“然后”条款被替换为一个逗号,“其他”条款被替换为一个逗号和“结束”被替换为“)”。 当布尔表达式”OrderAmt > 200“真值”显示高美元的秩序”。 当布尔表达式的OrderAmt > 200“假然后评估”显示低美元的秩序”。 如果你运行清单9和10中的代码你会看到他们都产生相同的输出。

IIF嵌套函数的例子

就像这样表达SQL Server允许您巢IIF功能。 在清单11中是IIF嵌套函数的一个例子。

选择OrderAmt,

国际金融协会(OrderAmt < 100

< 100美元的订单,

(IIF(OrderAmt < 200,

100美元的订单,

(IIF(OrderAmt < 300,

(IIF(分期预付= ‘ N ‘,

200美元的订单没有礼物,

200美元订单预约购物

)

),

(IIF(分期预付= ‘ N ‘,

300美元的订单没有礼物,

300美元订单预约购物

)

)

)

)

)

)

)作为OrderAmt_Category

从MyOrder;

清单11:嵌套一个IIF函数的例子

在这个例子中你可以看到,我已经多次IIF函数使用。 每增加一个是用于“真实价值”或“假价值”的国际金融功能。 清单11中的代码相当于使用嵌套的情况下表达式的代码如清单7所示。

限制

如同大多数TSQL功能有限制。 下面是一些限制要注意关于此案,IIF构造。

案例表达的局限性:

  • 你可以只有10水平的嵌套表达式。
  • 情况下表达式不能用于控制流TSQL语句的执行。

IIF功能限制:

  • 你只能有10水平的嵌套IIF条款。

总结

表达和IIF功能允许您将表达逻辑TSQL代码中,将改变您的代码的结果基于一个表达式的计算结果。 通过比较表达支持的国际金融功能和表达你可以有不同的代码块执行取决于比较表达式的求值结果为TRUE或FALSE。 表达和IIF函数提供你编程控制以满足业务需求,否则你可能不会有。

问题和答案

在本节中,您可以检查你懂了如何使用案例和IIF构造通过回答下列问题。

问题1:

有两种不同的语法差异的案例表达:简单搜索。 这两个语句下面最好的描述一个简单的区别和搜索表达式(选择两个)。

  1. 简单的例子中语法只支持相等操作符,而搜索语法支持多个运营商
  2. 简单的语法支持多个运营商,而搜索语法只支持相等操作符
  3. 简单的例子中语法WHEN子句有其指定的布尔表达式后,而搜索语法有布尔表达式的左边CASE语句后,和布尔表达式的右边WHEN子句之后。
  4. 简单的语法有左边的布尔表达式的CASE语句和右侧后WHEN子句后的布尔表达式,而搜索情况下表达WHEN子句后的布尔表达式

问题2:

如果表达有多个条款时,评估为TRUE,然后执行/ ELSE子句吗?

  1. 然后表达式的最后当条款执行评估为TRUE。
  2. 然后表达式的第一个值为TRUE的条款执行。
  3. 所有表达式的值为TRUE的条款执行。
  4. 执行其他表达式

问题3:

多少个嵌套级别情况下表达或IIF功能有吗?

  1. 8
  2. 10
  3. 16
  4. 32

答案:

问题1:

答案是a和d。一个简单的CASE语句只能使用相等操作符,而搜索情况下表达可以处理多个运营商和以及复杂的布尔表达式。 另外简单的语法有左手相等操作符的一部分后,右手一词的一部分相等操作符后当这个词。 搜索案例表达完成布尔运算(左手部分运营商的右手部分)后WHEN子句

问题2:

正确的答案是b。如果多个条款评估为TRUE时然后SQL Server只有执行的第一条款部分评估为TRUE。 所有其他条款对任何其他条款,评估为TRUE时跳过。

问题3:

正确的答案是b。这样表达和IIF函数只支持10嵌套的水平。

时间: 2024-10-11 18:57:35

第九周翻译的相关文章

第九周翻译:使用CASE表达式和IIF函数

通往t - sql的阶梯:超越基本级别6:使用CASE表达式和IIF函数    在2016年4月20日被Gregory Larsen所创作,第一次出版于2014年4月9日. 这一系列: 这篇文章是阶梯系列的一部分:楼梯T-SQL:超越基础 下面就从他的楼梯T-SQL DML.Gregory Larsen覆盖的T-SQL语言如子查询更先进的方面. 很多时候,你需要写一个TSQL语句,能够返回基于另一个表达的评价不同的TSQL表达式.当你需要这种功能,你可以使用CASE表达式或IIF函数满足这个要求

2017-2018-1 20155228 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155228 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 常见的存储技术 RAM 随机访问存储器(Random-Access Memory, RAM)分为两类:静态的和动态的.静态 RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多.SRAM用来作为高速缓存存储 器,既可以在CPU芯片上,也可以在片下.DRAM用来作为主存以及图形系统的帧缓冲 区.典型地,一个桌面系统的SRAM不会超过几兆字节,但是DRAM却有几百或几千兆 字节. SRAM将每

2017-2018-1 20155331 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155331 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 存储器层次结构 存储技术 随机访问存储器 随机访问存储器分为:静态的SRAM.动态的DRAM 静态RAM: SRAM的特点:存储器单元具有双稳态特性,只要有电就会永远保持它的值,干扰消除时,电路就会恢复到稳定值. 动态RAM: DRAM的特点:每一位的存储是对一个电容的充电:对干扰非常敏感. 用途:数码照相机和摄像机的传感器 DRAM存储不稳定的应对机制: 存储器系统必须周期性地通过读出,或者重

20155234第九周《信息安全系统设计基础》学习总结

20155234第九周<信息安全系统设计基础>学习总结 第六章 存储器结构层次 CPU执行指令,而存储器系统为CPU存放指令和数据. 存储器系统是一个线性的字节数组. 实际上,存储器系统是一个具有不同的容量.成本和访问时间的存数设备的层次结构.靠近CPU的小的.成本和访问时间的存储设备的层次结构. 高速缓存存储器是作为主存储器的数据和指令的缓冲区域. 主存暂时存放存储在容量较大的.慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带的数据的缓冲区. 局部性的基本属性:

2018-2019-1 20165225《信息安全系统设计基础》第九周学习总结

2018-2019-1 20165225<信息安全系统设计基础>第九周学习总结 教材学习内容总结 1.理解虚拟存储器的概念和作用; 2.理解地址翻译的概念; 3.理解存储器映射; 4.掌握动态存储器分配的方法; 5.理解垃圾收集的概念; 6.了解C语言中与存储器有关的错误; 虚拟存储器 物理和虚拟寻址 计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址.CPU根据物理地址访问存储器的方式是物理寻址. 虚拟存储器被组织为一个由存放在磁盘上的N个连续的字

第九周

第九周 1. 1.1负载电感 0mH       触发角π/4: 1.2 负载电感 0mH       触发角π/2: 1.3 负载电感 0.05mH       触发角π/4: 2. 2.1 负载电感 0mH       触发角π/4: 2.2 负载电感 0mH       触发角π/2: 2.3 负载电感 0.1mH       触发角π/4:

第九周 psp

团队项目PSP 一:表格     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论用户界面 9:50 12:45 35 45 80 分析与设计 设计网页界面 13:50 17:40 25 175 270 编码 具体编码 8:40 22:30 810 170 340 调试运行 修改代码.代码复审 18:10 22:50 50 115 90 总结 总结结果 22:55 23:10 0 40 15 二:饼图 三:进度条 进度条 第九周 累计

第九周java学习总结

20145306<java程序设计>第九周学习总结 教材学习内容总结 第十六章 一.JDBC入门 1.JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性,数据库本身是个独立运行的应用程序,你撰写的应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找.通常你的应用程序会利用一组专门与数据库进行通信协议的链接库,以简化与数据库沟通时的程序撰写.有时候,更换数据库的需求并不是没有,应用程

java第九周学习总结

学号20145336 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性. JDBC是Java联机数据库的标准规范.具体而言,它定义了一组标准类与接口,应用程序需要联机数据库时调用这组标准API,而标准API中的接口由数据库厂商操作,通常称为JDBC驱动程序. JDBC(Java DataBase Connectivity)是Java联机数据库