PL / pgSQL中的%%是什么意思?

时间:2014-04-04 14:17:43

标签: sql postgresql plpgsql

我正在阅读Instagrams sharding solution,我注意到以下一行:

SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;

上面的SELECT行中的%%是做什么的? 我查找了PostgreSQL,我发现的唯一一件事就是当你想使用字面百分比字符时使用%%。

CREATE OR REPLACE FUNCTION insta5.next_id(OUT result bigint) AS $$
DECLARE
   our_epoch bigint := 1314220021721;
   seq_id bigint;
   now_millis bigint;
   shard_id int := 5;
BEGIN
   SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;

   SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
   result := (now_millis - our_epoch) << 23;
   result := result | (shard_id << 10);
   result := result | (seq_id);
END;
$$ LANGUAGE PLPGSQL;

3 个答案:

答案 0 :(得分:4)

我能想到的唯一的位置,%在标准Postgres中加倍,在format()函数中,通常用于生成查询字符串动态SQL。 Compare examples here on SO.

The manual

  

除了上面描述的格式说明符之外,还有特殊的   序列%%可用于输出文字%字符。

在动态声明中使用modulo operator %时很棘手!

我怀疑他们正在幕后运行动态SQL - 他们对文章进行了概括和简化。 (序列的模式限定名称为'insta5.table_id_seq',表格不会被命名为&#34; table&#34 ;.)在此过程中,他们忘记了&#34; unescape&#34;模运算符。
这就是他们实际可能正在运行的内容:

EXECUTE format($$SELECT nextval('%I') %% 1024$$, seq_name)
INTO seq_id;

答案 1 :(得分:2)

使用默认安装(在9.2上):

ERROR: operator does not exist: bigint %% integer
SQL state: 42883

所以我想说它可能是

答案 2 :(得分:1)

看起来像是对我进行了转义modulo operator