尽管声明字串常量的标准方法通常都很方便,但是如果字串包含很多单引号或者反斜杠, 那么理解字串的内容可能就会变得很苦涩,因为每个单引号都要加倍。 为了让这种场合下的查询更具可读性,PostgreSQL 允许另外一种称作"美元符包围"的字串常量声明办法。 一个通过美元符包围声明的字串常量由一个美元符号($),一个可选的零个或多个字符"记号", 另外一个美元符号,一个组成字串常量的任意字符的序列,一个美元符号,以及一个和开始这个美元符包围的记号相同的记号,和一个美元符号组成。 比如,下面是两个不同的方法,用美元符包围声明了前面的例子:
$$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 标准,但是在写复杂的字串文本的时候,它通常比标准的单引号语法更方便。 尤其是在其它常量里表现字串常量的时候更有用,比如经常在过程函数定义里面的。 如果用单引号语法,每个上面例子里的反斜杠都必须写四个,它们在作为字串文本分析的时候会减少为两个, 然后在函数执行的时候在内层字串常量里会再次被解析为一个。
位串常量看起来很象在开引号前面有一个 B (大写或小写)的普通字符串(它们之间没有空白), 比如 B'1001'。位串常量里可以用的字符只有 0 和 1。
另外,位串常量可以用十六进制表示法声明,方法是使用前缀的 X (大写或者小写),比如,X'1FF'。 这种表示法等效于一个每个十六进制位四个二进制位的位串常量。
两种形式的位串常量都可以象普通字串常量那样跨行连续。 美元符包围不能用于位串常量。
数值常量接受下列通用的形式:
digits
digits.[digits][e[+-]digits]
[digits].digits[e[+-]digits]
digitse[+-]digits
这里的 digits 是一个或多个十进制位(0 到 9)。 如果有小数点,那么至少有一位在小数点前面或后面。如果出现了指数分隔符(e),那么至少有一个位跟在它后面。 在常量里不能有空格或者其他字符嵌入在内。 请注意任何前导地正号或者负号实际上都不认为是常量的一部分; 它是施加于常量的一个操作符。
这里是一些合法的数值常量的例子:
42
3.5
4.
.001
5e2
1.925e-3
如果一个数值常量既不包含小数点,也不包含指数操作符, 那么如果它的数值可以放在integer类型中(32位), 则认为它是integer类型;如果它的数值可以放在 bigint中(64位),则认为它是 bigint; 否则认为它是 numeric类型。包含小数点和/或指数操作符的常量总是被认为是numeric类型。
给一个数值常量赋予初始数据类型只是类型解析算法的开端。 在大多数情况下该常量会根据环境被自动强制转换成最合适的类型。 必要时,你可以通过强制类型转换把一个数值解析成特定的数据类型。 比如,你可以强制要求把一个数值当作类型real(float4)来看,方法是这么写:
REAL '1.23' -- 字串风格
'1.23'::REAL -- PostgreSQL (历史原因)风格
这些实际上只是下面讨论的通用转换的特例。
任意类似的常量可以用下列表示法中的任何一种来输入:
type 'string'
'string'::type
CAST ( 'string' AS type )
在字串常量的文本将传递给那种叫 type 的类型的输入转换过程。 结果是这种类型的一个常量。如果不存在该常量所属类型的歧义, 那么明确的类型映射可以省略(比如,当你把它直接赋予一个表字段的时候), 这种情况下它会自动转换。
字串常量可以用普通 SQL 表示法或者美元符包围来书写。
我们还可以用函数样的语法来声明类型转换:
typename ( 'string' )
不过并非所有类型名可以这样使用;参阅 Section 4.2.8 获取细节。
::,CAST(),和函数调用语法也可以用于声明任意表达式的运行时类型转换, 如 Section 4.2.8 中讨论的那样。 但是 type 'string' 的形式只能用于声明一个文本常量的类型。 type 'string' 的另外一个限制是它不能用于数组类型;要用 :: 或者 CAST() 声明一个数组常量的类型。
CAST() 语法遵循 SQL。 type 'string' 语法是标准的一个推广:SQL 只是给少数几种数据类型声明了这个语法, 但 PostgreSQL 允许将其用于所有类型。带 :: 的语法是 PostgreSQL 的历史用法,函数调用语法也是。
分享到:
相关推荐
《TimescaleDB与PostgreSQL12在Windows 64位环境的应用详解》 TimescaleDB,作为一款专为时间序列数据分析而设计的开源数据库扩展,为PostgreSQL提供了强大的功能支持。在本文中,我们将深入探讨TimescaleDB 1.7.1...
### PostgreSQL 9.6.0 中文手册概览与核心知识点 #### 一、PostgreSQL 简介 - **PostgreSQL** 是一款强大的开源对象关系型数据库系统,以其稳定性、可靠性以及对 SQL 标准的支持而著称。 - **版本信息**:此文档为...
- **语法规范**:深入探讨 SQL 语言的语法结构,包括关键字、标识符、字符串常量等的使用规则。 - **数据类型**:列举并解释了 PostgreSQL 支持的各种数据类型,如整数、浮点数、字符串、日期时间等。 - **表达式与...
这个postgresql-hll扩展最初是由Aggregate Knowledge(现在是的一部分)的科学团队开发的。 有关其贡献者的详细信息,请参见下面的“部分。 演算法 hll是可以被视为层次结构的不同集合/区别值计数算法的组合,以及...
4. **include/** 和 **src/include/**:头文件目录,定义了PostgreSQL的各种数据结构、函数原型和常量。 5. **Makefile** 和 **configure**:构建脚本,用于配置和编译源代码,使其适应不同的操作系统环境。 6. **...
AspNet.Identity.PostgreSQL 这个项目是一个用于 PostgreSQL 数据库的 Asp.Net 身份提供程序。 它已被使用 ,因此,应该适用于大多数 PostgreSQL 版本。 该项目的基础是和 ,并进行了大量修改,使您可以更轻松地...
PG错误常数与Node.js一起使用的PostgresQL错误常量。 使用这些可避免类似if (err.code === '23505') ,而应编写if (err.code === UNIQUE_VIOLATION) 。安装npm install --save pg-error-constants用法const { UNIQUE...
3. **libpq-fe.h**:这是libpq接口的头文件,包含了所有与PostgreSQL通信相关的函数声明、常量定义和数据结构。在你的源代码中包含此头文件,可以使用libpq提供的功能,如`PQconnectdb()`用于建立连接,`PQexec()`...
这些文件定义了函数原型、数据结构和常量,让开发者能够调用PostgreSQL的API,创建连接、执行SQL查询、处理结果集等操作。理解并熟练使用这些头文件是进行PostgreSQL应用程序开发的基础。 接下来,我们来看“lib”...
- **日期时间常量** - **当前日期** - **当前时间** - **当前日期时间** - **除去时区** - **计算时间差** - **计算时间和** - **date_part**:提供了计算日期部分的函数示例。 - **汉字做字段名**:演示了...
- **枚举类型**:`enum`,自定义的一组命名常量集合。 - **数值类型**: - `integer`或`int4`:整数。 - `bigint`或`int8`:大整数。 - `double precision`、`float4`、`float8`:浮点数。 - `numeric(length, ...
尽管在MS SQL Server中双引号和单引号均可作为字符串常量的标识符,但在PostgreSQL中,双引号具有特殊意义——它们用于标识数据库对象名,而不能用于字符串常量。为了代码的一致性和避免潜在的混淆,始终推荐使用单...
附录通常包含技术细节、兼容性信息、系统常量和函数的完整列表,以及各种有用的参考资料,如 SQL 函数和操作符的完整索引。 PostgreSQL 8.3 版本的亮点还包括对 Berkeley DB 兼容性的提升,Berkeley DB 是一种...
- **日期时间常量**:PostgreSQL提供了丰富的日期时间函数和操作符,便于处理各种日期时间相关的计算和比较。 - **汉字做字段名**:PostgreSQL支持使用汉字作为字段名称,但在设计数据库结构时应尽量避免使用特殊...
词法结构涉及标识符、关键字、常量、操作符、特殊字符和注释的使用规则。例如,标识符用于识别数据库对象如表和列,而关键字则用于构建SQL语句。此外,文档还强调了词法优先级,这对于正确理解表达式的计算顺序至关...
- 表达式:在查询语句中使用的计算公式,可以是常量、变量、函数等。 - 索引:提高查询速度的数据结构,如B树索引、哈希索引等。 - 视图:虚拟表,基于查询结果,可以像普通表一样进行操作。 - 函数:预定义或自定义...
3. 常量参数转换:必须显式转换为PostgreSQL支持的数据类型,例如将'new'转换为varchar。 4. 函数替换:将Oracle特有的函数替换为PostgreSQL的等价函数,如wm_concat替换为string_agg,regexp_replace增加第三个参数...
介绍了日期时间常量的使用,包括当前日期、当前时间、当前日期时间以及如何处理时区和计算时间差。文档还涉及了数据类型转换、序列的生成、数据转换、约束的设定(包括检查约束、非空约束和唯一约束)以及主键和外键...
PostgreSQL是一款功能强大的开源关系型数据库管理系统,自从其9.6.0版本发布以来,为数据库领域提供了丰富的功能与改进。该版本的中文文档由武汉大学彭煜玮教授负责翻译,提供给中文使用者更加便利的学习和使用条件...