《PostgreSQL服务器编程》一一3.3 条件表达式

3.3 条件表达式

条件表达式允许开发者通过明确的标准来控制函数的动作。下面这个例子使用了CASE语句,通过值来控制字符串的处理。如果该值为空,或者包含一个零长度字符串,则视为空。




这里的设想是,当全名中的任何一个元素缺失时,周边的标点符号和空格也应同时缺失。这个函数会返回一个美国人的全名,且希望名称的各个部分尽可能的完整。当运行这个函数时,我们会看到以下内容:

条件表达式的另外一种使用方法是使用IF/THEN/ELSE块。以下是相同的函数,但使用了IF语句而不是CASE语句。

PostgreSQL的PL/pgSQL里提供了这些条件表达式更多的语法变种。这里介绍了一些最常用的表达方式。你可以访问链接http://www.postgresql.org/docs/current/static/functions-conditional.html,查看更完整的讨论。
3.3.1 通过计数器循环
PL/ pgSQL语言为各元素之间的循环提供了一种简单的方法。以下函数将返回第n个斐波那契(Fibonacci)序列号:

以上代码的输出结果为3。
在这个函数中,我们可以计算出最高的斐波那契(Fibonacci)数是4785。如果参数的一个值比这个值大,结果就不符合我们所声明的长度为1000的小数。
仅作备忘,在斐波那契(Fibonacci)序列中每个元素都是序列中前2个元素的累加。因此,序列中前面几个元素应该是0,1,1,2,3,5,8,13,21,34,... 互联网上也提供了一些PostgreSQL斐波那契(Fibonacci)序列函数,但它们均使用了可怕的递归方法。对于我们这种情况,递归是一件非常糟糕的事情。
在这个函数中,我们在声明部分也介绍了变量的默认值。一旦调用函数,这些变量就会被设成默认值。
同时让我们快速看一下语句SELECT b,a+b INTO a,b,该语句同时进行2个?变量赋值。在执行a与b的过程中,它避免了第三个变量的引入。
你可以通过访问链接http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html,查看PostgreSQL文档页,来获取其他循环语法。
3.3.2 对查询结果进行循环
在我们开始对查询结果进行循环之前,我觉得有必要提醒你,如果你正在使用这个方法,你可能做错了。它是属于PostgreSQL中处理器与内存密集型的其中一种操作。我们基本无理由在数据库服务器上进行结果集的循环。我建议你进行一次深入思考,如何使用一个函数、查询中的值列表、临时表和永久表来实现同样的想法,或者采用任何可能的方法预先计算这个值,从而避免这种操作。因此,你仍然认为你有非常充分的理由来使用这项技术?好吧,请继续往下读。
以下是一个简单的版本:

上面的这个例子展示了任务队列中消息处理的基本策略格局。通过这个技术,表中的行包含了需要处理的任务。
我们在这里也介绍一下EXECUTE语句。SELECT语句是一个字符串值。通过EXECUTE,我们可以以字符串的形式动态构建PL / pgSQL命令,然后作为数据库的语句来调用它们。这个技术非常方便,特别是当我们准备改变表名称或者其他SQL关键字,来补充语句的时候。这些SQL语句部分不能存储在变量中,而且通常情况下不可变。借助EXECUTE,我们可以改变语句中的任何部分。
以下是来自PostgreSQL文档的一个例子,该例子展示了在循环内部运行的动态命令:

以上这个循环的例子显示了一个更复杂的函数,该函数刷新一些临时表中的数据。由于数据实际上是物理传输到临时表中,因此这些临时表被认为是“物化视图”。为了降低相同数据的查询执行开销,我们可以采取这种常见的方法。在这种情况下,相对于重复查询相同数据导致的持续开销,循环的低效率似乎又不值得一提。
3.3.3 PERFORM与SELECT
你可能在之前的例子中已经注意到一个我们并未介绍过的语句。PERFORM是一个命令。当想要放弃一个语句结果的时候,可以使用该命令。如果上面的例子改成:

查询引擎将返回No destination for result data。
我们可以将结果转换成变量,进而忽略变量,但这样有点不合我味。通过PERFORM语句,我们已经表明,忽略结果不是偶然的。我们很高兴看到这样一个事实,日志被盲目地叠加,但如果不是这样,我们可能由于日志条目问题而无法继续执行。

时间: 2024-08-30 06:00:57

《PostgreSQL服务器编程》一一3.3 条件表达式的相关文章

《PostgreSQL服务器编程》一一导读

前 言 PostgreSQL服务器远远不只是一台数据库服务器.实际上,PostgreSQL甚至可以承担起一个应用程序开发框架的角色,这个框架的优势在于其具备事务支持.大量数据存储.日志记录.系统恢复等功能,以及PostgreSQL引擎提供的许多优秀特性.在蓬勃发展的商业化时代,如果你掌握了足够的PostgreSQL相关知识,你将有能力满足当前人才市场对高级PostgreSQL技能的强烈需求. 本书将带你学习PostgreSQL函数基础知识.在学习过程中,你将会使用各种程序语言(不限于自带的PL/

《PostgreSQL服务器编程》一一第1章 PostgreSQL服务器简介

第1章 PostgreSQL服务器简介 如果你认为PostgreSQL服务器仅仅是一个存储系统,和它交流的唯一办法就是通过SQL语句,那么你就严重了低估了它的特性.这仅仅是这个数据库的特性之一.PostgreSQL服务器是个强大的架构,它可以用来完成各种各样的数据处理,甚至包括一些非数据服务器的工作.它是一个服务器平台,你可以在这个平台上对各种流行的编程语言开发的函数或库进行简单的组合与匹配.我们来看一下这种复杂的多语言工作顺序:1)调用以Perl编写的字符串解析函数.2)把字符串转换成XSLT

《PostgreSQL服务器编程》一一1.8 程序设计最佳实践

1.8 程序设计最佳实践 开发应用程序软件是复杂的.一些有助于管理复杂性的方法非常流行,以至于它们被赋予容易记忆的首字母缩略词.接下来,我们就会介绍一些这样的规则,并介绍如何在服务器程序设计时更好地遵守这些规则.1.8.1 KISS--尽量简单(keep it simple stupid)成功的程序设计的一个重要技术就是编写简单的代码.也就是,你编写的代码3年以后仍然可以很容易理解,并且其他人也可以理解.这种方式并不一定总是行得通,但是尽可能用最简单的方法编写代码总是有意义的.由于各种原因,比如

《PostgreSQL服务器编程》一一2.7 小结

2.7 小结 现在你对PostgreSQL的环境已经有了一些了解,同时你也了解了一些对未来有所帮助的内容.架构PostgreSQL就是为了处理你的需求.但更重要的是,它不会在将来某一天将你全盘推翻.我们已经接触了一些环境的相关知识,当在PostgreSQL的服务器上编程时,我们脑海里也能涌现出一些重要的知识点.如果你没有记住所有的内容,也不要着急.在下一章中,我们会引入一些真正有用的函数.届时,你可以再回到本章,温故而知新,更深入地理解函数的特征.

《PostgreSQL服务器编程》一一2.6 过程化语言

2.6 过程化语言 SQL Server允许你使用任何产生CLR的语言来创建DLL.这些DLL必须在启动的时候被加载到服务器里面.为了在运行时间创建一个程序,并且使它立即可用,唯一的选择就是内建的SQL方言--Transact SQL(TSQL). MySQL有一个叫做插件的功能.其中一种合法的插件类型是过程化语言.几种语言完成加工后,借由插件系统可以和MySQL一起工作.这些语言包括了最流行的几种语言,比如PHP.Python等.这些函数不能被用在存储过程与触发器中,但是它们可以被普通SQL语

《PostgreSQL服务器编程》一一3.2 PL/pgSQL函数的结构

3.2 PL/pgSQL函数的结构 如果我们想运行一个PL/pgSQL函数,实际上并不需要太多元素.以下就是一个非常简单的例子: 前面这个函数显示了最少元素的PL / pgSQL函数.该函数为substring内置函数创建了一个别名mid.对于Microsoft SQL Server或者MySQL的开发者而言,这是一个非常合适的别名,并且他们可以弄明白mid函数的实现过程.同时,这个函数也阐述了最基础的参数传递策略.这些参数在函数中并未被命名而是通过从左至右的相对位置被访问的. PL / pgS

《PostgreSQL服务器编程》一一1.10 总结——为什么在服务器中进行程序设计

1.10 总结--为什么在服务器中进行程序设计 我们在服务器端完成大部分数据操作编程工作,主要优势有以下几点.1.10.1 性能我们进行基于数据的计算几乎总是性能为王,也就是,我们会努力使获得数据的时间周期变得更短.通常在一个典型的数据密集型计算中,我们的大多数时间都集中花费在获得数据上.因此,在计算中,如何使数据访问变得更快就是使整个计算过程变得更高效的最好方法.在我的笔记本电脑上,从100000行记录的数据库中,随机查询一行并返回客户端需要花费2.2ms,但是在数据库内部获取数据,这个操作仅

《PostgreSQL服务器编程》一一1.2 关于本书的代码示例

1.2 关于本书的代码示例 这里输出显示的示例都是使用PostgreSQL的psql工具创建的,psql工具通常是在Linux系统上运行的.如果你使用一个GUI工具(比如pgAdmin3)去访问服务器,绝大多数的代码同样是生效的.当你看见以下的代码行时: postgres=#部分是psql命令显示的提示.本书中的例子已经在PostgreSQL 9.2中测试通过,它们应该可以在PostgreSQL 8.3或更高版本中运行.相比PostgreSQL最近几个版本上的服务器程序设计,其实并没有发生多少根

《PostgreSQL服务器编程》一一1.11 小结

1.11 小结 对于许多开发者而言,在数据库服务器上进行程序设计往往并不是他们首选的实现方式.但是因为这样的程序设计在应用程序队列里面有着独特的地位,使其有着非常强大的竞争优势.通过把逻辑放到数据库内处理,你的程序会变得更快.更安全.更易于维护.通过使用服务器端的PostgreSQL程序设计,你可以:使用函数让你的数据变得更为安全使用触发器审核你的数据访问使用定制化的数据类型来丰富你的数据使用定制化的操作符来分析你的数据而对于你在PostgreSQL中可实现的所有功能而言,以上这些仅仅只是一个开