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. ...
一周排行
  • ========================== 内存管理 ========================== [问]内存管理到底做了件什么事? oc中内存是如何创建和如何释放. oc内存管理 [手动内存管理M ...
  • 一直很奇怪的一点,字母国家的人是怎么想出面向对象这个概念的,中文却是自然语言中非常具有面向对象特征的语言.我们看看如下的表格对应 中文英文公鸡Cock母鸡Hen小鸡Chick病床Sickbed婴儿床Infanette ...
  • Python通过prettytable模块将输出内容如表格方式整齐输出:首先下载prettytable模块,下载连接:https://pypi.python.org/pypi/PrettyTable下载后解压,1:c ...
  • 上个星期学习了域,在这里叙述些相关的概念,和解决方案.          先来说说,为什么要部署域,说到域,就不的不提到计算机的工作模型,它们是域和工作组,系统默认安装是在工作组下,工作组是分散式的,适合小型公司,域 ...
  • 序列化的5w2h分析 what:序列化是一种将java对象流化的机制 how:将一个实现了Serializable接口的对象的状态写入byte[],传输到另外一个地方,将其读出进行反序列化得对象(含状态).状态就是类 ...
  • 在exp语句后面增加   direct=N exp  中direct 参数默认为N , 即采用普通路径导出,和使用程序导出恢复数据一样,和执行其他查询一样, 从磁盘和高速缓冲区读取数据, 从那里,数据被移到一个工作区 ...
  •  netsh interface tcp set global autotuninglevel=disabled 如果在Vista或windows7上通过远程桌面控制服务器速度比较慢,可以试试这个命令:netsh i ...
  • Ubuntu12.04LTS更新后,导致VirtualBox虚拟机不能使用
    Ubuntu更新后,导致VirtualBox虚拟机软件打不开,出现以下错误提示,以下是解决 ...
  • 自动分配IP地址  执行命令system-view,进入系统视图.执行命令interfaceinterface-typeinterface-number,进入接口视图.执行命令nap port master,配置并启 ...
  • 001 1非简单图:既无平行边也无环的无向图称为简单无向图,有平行边或有环的图是非简单图.       2 完全图:每个顶点度数都等于(n-1)的n阶无向简单图称为n阶无向完全图,记做Kn       3  哈密尔顿 ...