1.正常情况下使用单引号引用一个字符串

hank=# select 'the world is so beautiful';
         ?column?          
---------------------------
 the world is so beautiful

2.如果字符串中有单引号,可以写两个单引号

hank=# select 'I''m OK';
 ?column? 
----------
 I'm OK
(1 row)
--如果是老版本的数据库,使用E加\的方式,如下:

hank=# select E'I\'m OK'; 
 ?column? 
----------
 I'm OK
(1 row)

3.如果字符串中间有多个’或者\,那么用上线的方法将会写很多的’或者\,所以这里用$$,语法如下:

$tag$<string_constant>$tag$


如下:只使用$$和在$$之间加tag,效果一样
hank=# select $$I'm a string constant that contains a backslash \$$;
                     ?column?                      
---------------------------------------------------
 I'm a string constant that contains a backslash \
(1 row)

hank=# select $big$I'm a string constant that contains a backslash \$big$; 
                     ?column?                      
---------------------------------------------------
 I'm a string constant that contains a backslash \

4.在匿名块中使用$$

如下一张表
hank=# \d bigtable
               Table "hank.bigtable"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 id     | integer |           |          | 
 v      | integer |           |          | 

查询最大id,并用notice打印出来
do 
'declare
   v_id integer;
begin 
   select max(id) into v_id
   from bigtable;
   raise notice ''The number is: %'', v_id;
end;';

NOTICE:  The number is: 1000000
DO


如上,有单引号,那么和之前的处理方法一样,需要写两个单引号
raise notice ''The number of films: %'', film_count;



为了避免单引号使用的混淆和易读性,使用$$代替,代码会更易读
do 
$$
declare
   v_id integer;
begin 
   select max(id) into v_id
   from bigtable;
   raise notice 'The number is: %', v_id;
end;
$$;

NOTICE:  The number is: 1000000
DO

5.函数里面使用’或者$$

语法格式如下:
create function function_name(param_list) 
    returns datatype
language lang_name
as 
 'function_body'

实例:
create function f_bigtable(
   int
) returns bigtable 
language sql
as 
  'select * from bigtable 
   where id = $1';
hank=# select * from f_bigtable(444);
 id  |  v   
-----+------
 444 | 6958

使用$$替换后如下
create function f_bigtable(
   int
) returns bigtable 
language sql
as 
  $$select * from bigtable 
   where id = $1$$;


hank=# select * from f_bigtable(444);
 id  |  v   
-----+------
 444 | 6958



6.另外官方几个例子,4个,6个,10个单引号,使用$$替换

两个单引号,前面演示过
a_output := ''Blah'';
SELECT * FROM users WHERE f_name=''foobar'';
a_output := 'Blah';
SELECT * FROM users WHERE f_name='foobar';

四个单引号
a_output := a_output || '' AND name LIKE ''''foobar'''' AND xyz''
a_output := a_output || $$ AND name LIKE 'foobar' AND xyz$$

六个单引号,其实就是四个和两个连着
a_output := a_output || '' AND name LIKE ''''foobar''''''
a_output := a_output || $$ AND name LIKE 'foobar'$$

十个单引号使用
a_output := a_output || '' if v_'' ||
    referrer_keys.kind || '' like ''''''''''
    || referrer_keys.key_string || ''''''''''
    then return ''''''  || referrer_keys.referrer_type
    || ''''''; end if;'';

a_output后面的值为 if v_... like ''...'' then return ''...''; end if;

a_output := a_output || $$ if v_$$ || referrer_keys.kind || $$ like '$$
    || referrer_keys.key_string || $$'
    then return '$$  || referrer_keys.referrer_type
    || $$'; end if;$$;

更多推荐