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. ...
一周排行
  • 1.安装Docker之后,下载不了镜像,错误为[[email protected]~]# docker run hello-world Unable to find image 'hello-world:latest'  ...
  • 文档说明:该文档针对的是Exchange Server 2013预览版的信息,与最终发布版本存在差异,仅供微软技术爱好者参考文档信息来自Technet英文站点.(绝对原创翻译)1.AD准备在将用来准备活动目录的计算机 ...
  • 关于Everyone列表的问题
        使用MDaemon邮件服务器的用户一般都知道,MDaemon为了方便用户群发邮件, ...
  • AIX下删除LV后的现场保护和数据恢复方案
    在AIX环境下,因维护误操作.存储mapping错误等,不小心将LV误删除,这种损失通常是 ...
  • SQL Server扩展事件(Extended Events)-- 将现有 SQL 跟踪脚本转换为扩展事件会话如果您具有想要转换为扩展事件会话的现有 SQL 跟踪脚本,则可以使用本主题中的过程创建等效的扩展事件会话. ...
  •     根据要求配置MySQL主从备份.读写分离,结合网上的文档,对搭建的步骤和出现的问题以及解决的过程做了如下笔记:      现在使用的两台服务器已经安装了MySQL,全是rpm包装的,能正常使用.      为 ...
  • 配置DHCP中继代理并在server2008上创建DHCP服务器详细过程
    在虚拟机server 2008上面创建DHCP服务,使宿主机通过中继代理的方式自动获得IP ...
  • Mac下搭建SVNserver
    Mac系统已经自带了svn我们已经不需要安装svn服务器了.1.打开terminal可以使 ...
  • 出错代码如下:      static String u = "user";      static String p = "psw";      static String ...
  • 代码正在修改中 请稍后评价 谢谢CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址.CS为代码段寄存器.IP为指令指针寄存器.在8086PC机中,任意时刻,设CS中的内容为M,IP中 ...