PostgreSQL中美元符号引用的字符串常量

虽然用于指定字符串常量的标准语法通常都很方便,但是当字符串中包含了很多单引号或反斜线时很难理解它,因为每一个都需要被双写。要在这种情形下允许可读性更好的查询,PostgreSQL提供了另一种被称为“美元引用”的方式来书写字符串常量。一个美元引用的字符串常量由一个美元符号($)、一个可选的另个或更多字符的“标签”、另一个美元符号、一个构成字符串内容的任意字符序列、一个美元符号、开始这个美元引用的相同标签和一个美元符号组成。例如,这里有两种不同的方法使用美元引用指定字符串“Dianne’s horse”:

$$Dianne’s horse$$

$SomeTag$Dianne’s horse$SomeTag$

注意在美元引用字符串中,单引号可以在不被转义的情况下使用。事实上,在一个美元引用字符串中不需要对字符进行转义:字符串内容总是按其字面意思写出。反斜线不是特殊的,并且美元符号也不是特殊的,除非它们是匹配开标签的一个序列的一部分。

可以通过在每一个嵌套级别上选择不同的标签来嵌套美元引用字符串常量。这最常被用在编写函数定义上。例如:

$function$

BEGIN

RETURN ($1 ~ $q$[\t\r\n\v\\]$q$);

END;

$function$

这里,序列$q$[\t\r\n\v\\]$q$表示一个美元引用的文字串[\t\r\n\v\\],当该函数体被PostgreSQL执行时它将被识别。但是因为该序列不匹配外层的美元引用的定界符$function$,它只是一些在外层字符串所关注的常量中的字符而已。一个美元引用字符串的标签(如果有)遵循一个未被引用标识符的相同规则,除了它不能包含一个美元符号之外。标签是大小写敏感的,因此$tag$String content$tag$是正确的,但是$TAG$String content$tag$不正确。一个跟着一个关键词或标识符的美元引用字符串必须用空白与之分隔开,否则美元引用定界符可能会被作为前面标识符的一部分。

美元引用不是SQL 标准的一部分,但是在书写复杂字符串文字方面,它常常是一种比兼容标准的单引号语法更方便的方法。当要表示的字符串常量位于其他常量中时它特别有用,这种情况常常在过程函数定义中出现。如果用单引号语法,上一个例子中的每个反斜线将必须被写成四个反斜线,这在解析原始字符串常量时会被缩减到两个反斜线,并且接着在函数执行期间重新解析内层字符串常量时变成一个。

更多相关文章
  • java中的堆.栈.常量池 分类: java2010-01-15 03:03 4248人阅读 评论(5) 举报 javastring编译器jvm存储equals Java内存分配: 1. 寄存器:我们在程序中无法控制2. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中3. ...
  • 使用MicrosoftRoslyn提取C#和VB.NET源代码中的字符串常量
    Microsoft Roslyn是微软.NET“编译器即服务(Compiler as a Service)”的主要产品,它提供了开放的编译器API,并为源代码产生.分析和重构提供了新一代的语言对象模型.Anders Hejlsberg在BUILD 2013大会上提到,C# 6.0的编译器将使用Ros ...
  • linux脚中经常会遇到一大堆美元符号 ($),有些符号容易搞混,他们代表的含义我做个记录:$0  shell的命令本身(包括完整路径)$1到$9 数字表示shell 的第几个参数 $# 传递到脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数$$ 脚本运行的ID号$! 后台运行的最后一个进 ...
  • 字符串常量最好放到xml中
  • PostgreSQL中日期类型与字符串类型的转换方法 示例如下: postgres=# select current_date;date ------------2015-08-31(1 row) postgres=# select to_char(current_date,'YYYYMMDD'); ...
  • 转自:http://blog.csdn.net/able_cy/archive/2010/10/16/5944948.aspx系统实验中遇到了一些输入特殊字符出错的问题,查阅之后发现这属于linux中特殊符号的用法,查阅资料转载如下:1.{} 大括号:用法一:通配符扩展eg: ls my_{fing ...
  • String a="a"+"b"+"c" 创建了几个对象这个问题涉及到了字符串常量池和字符串拼接String a="a"+"b"+"c"通过编译器优化后,得到的效果是String  ...
  • 下面主要介绍JAVA中的堆.栈和常量池:1.寄存器最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.)3. 堆存放所有new出来的对象.4. ...
一周排行
  • zabbix安装一(debian)
    一.基础环境说明 1.zabbix官网 www.zabbix.com 2.zabbix介绍 ...
  • Getopt::Std模块的使用:初始设置:  在程序中加入如下代码:          use Getopt::Std;               use vars qw($opt_d $opt_f $opt_p ...
  • Varnish安装配置1.安装前的环境准备主机名               IP地址Varnish-server   eth0 172.16.23.1 桥接方式   eth1 192.168.23.111 仅主机W ...
  • Exchange2007灾难恢复手记
    经历了2天彻夜的奋战,终于将Exchange 2007 从灾难中恢复过来.也算是体验了一把 ...
  • Android课程---关于ListView列表视图的学习
    activity_ui3.xml <?xml version="1.0&q ...
  • 1.查找被锁定的资源   SELECT * FROM v$lock where request > 0; 2.查找引起锁的语句   SELECT DECODE(request,0,'Holder: ','Wai ...
  • 常用查询scripts , ) , , , , ) ) , , )), ), , , ) , )) , ,,,,, /*PO与PR关联 SCRIPTS*/ from po_distributions_all pda ...
  •       “终于跑完全程了”,跑到比赛终点的时候我对自己说.今天是学校本科院校的第一届春季运动会,本来不该我跑的.因同学有事不能跑所以我就替跑了,昨天还以为不会替跑呢.今天接到通知说是让我替跑,当时心情很紧张也很兴 ...
  • Ubuntu14.04FTP服务器--vsftpd的安装和配置
    更新源列表 打开"终端窗口",输入"sudo apt-get ...
  • SOA实施规划是最关键的.SOA的出发点完全不同于现有的建模和组件的出发点.现有的软件实施也是实际项目中的真实情况:软件的设计和开发人员在拿到业 务需求后,马上就会想到是不是需要用到Struts的MVC架构,是用EJ ...