PostgreSQL 教程: 美元符号引用的字符串常量

八月 22, 2023

摘要:在本教程中,您将学习如何在用户定义的函数和存储过程中使用美元符号 ($$) 引用的字符串常量。

美元符号引用的字符串常量语法介绍

在 PostgreSQL 中,您可以对字符串常量使用单引号,如下所示:

select 'String constant';

当字符串常量包含单引号 (') 时,需要通过将单引号加倍来对其进行转义。例如:

select 'I''m also a string constant';

如果您使用旧版本的 PostgreSQL,您可以在字符串常量前面加上E来声明后缀转义字符串语法,并使用反斜杠\转义单引号,如下所示:

select E'I\'m also a string constant';

如果字符串常量包含反斜杠,则需要使用另一个反斜杠对其进行转义。

当字符串常量包含许多单引号和反斜杠时,就会出现问题。将每个单引号和反斜杠加倍会使字符串常量更难以阅读和维护。

PostgreSQL 8.0 版本引入了美元符号引用特性,以使字符串常量更具可读性。

下面显示了美元符号引用的字符串常量的语法:

$tag$<string_constant>$tag$

在此语法中,tag是可选的。它可能包含零个或多个字符。

$tag$之间,您可以放置任何带有单引号 (') 和反斜杠 (\) 的字符串。例如:

select $$I'm a string constant that contains a backslash \$$;

在此示例中,我们没有在两个美元符号 ($) 之间指定tag

以下示例使用带标记的美元符号引用字符串常量语法:

SELECT $message$I'm a string constant that contains a backslash \$message$;

在此示例中,我们使用字符串message作为两个美元符号 ($) 之间的标记。

在匿名块中使用美元符号引用的字符串常量

下面显示了 PL/pgSQL 中的匿名块:

do 
'declare
   film_count integer;
begin 
   select count(*) into film_count
   from film;
   raise notice ''The number of films: %'', film_count;
end;';

请注意,您将在 PL/pgSQL 块结构教程中了解匿名块。在本教程中,您可以将代码复制并粘贴到任何 PostgreSQL 客户端工具(例如 pgAdmin 或 psql)中来执行它。

块中的代码必须用单引号引起来。如果它有任何单引号,您需要通过将其加倍来转义,如下所示:

 raise notice ''The number of films: %'', film_count;

为了避免转义每个单引号和反斜杠,您可以使用美元符号引用字符串,如下所示:

do 
$$
declare
   film_count integer;
begin 
   select count(*) into film_count
   from film;
   raise notice 'The number of films: %', film_count;
end;
$$

在此示例中,您不需要转义单引号和反斜杠。

在函数中使用美元符号引用的字符串常量

下面显示了允许您创建用户定义函数的CREATE FUNCTION语句的语法:

create function function_name(param_list) 
    returns datatype
language lang_name
as 
 'function_body'

请注意,您将在创建函数教程中了解有关CREATE FUNCTION语句语法的更多信息。

在此语法中,function_body是一个字符串常量。例如,以下函数通过 id 查找电影:

create function find_film_by_id(
   id int
) returns film 
language sql
as 
  'select * from film 
   where film_id = id';

正如您所看到的,find_film_by_id()函数体被单引号括起来。

如果函数有很多语句,就会变得更难以阅读。在这种情况下,您可以使用美元符号引用的字符串常量语法:

create function find_film_by_id(
   id int
) returns film 
language sql
as 
$$
  select * from film 
  where film_id = id;  
$$; 

现在,您可以在$$$$之间放置任何代码段,而无需使用单引号或反斜杠来转义单引号和反斜杠。

在存储过程中使用美元符号引用的字符串常量

同样,您可以在存储过程中使用美元符号引用的字符串常量语法,如下所示:

create procedure proc_name(param_list)
language lang_name
as $$
  -- stored procedure body
$$

概括

  • 使用美元符号引用的字符串常量以避免转义单引号或反斜杠。

  • 始终在用户定义的函数和存储过程中使用美元符号引用的字符串常量,以使代码更具可读性。