【问题标题】:Real, mathematical "modulo" operation in Postgres?Postgres中真实的数学“模”运算?
【发布时间】:2014-03-27 09:42:04
【问题描述】:

在 Ruby 中:

-2 % 24
=> 22

在 Postgres 中:

SELECT -2 % 24;
 ?column?
----------
      -2

SELECT mod(-2,24);
 mod
-----
  -2

我自己可以很容易地写一个,但我很好奇 Postgres 是否有一个真正的模运算,而不是除法后的余数。

【问题讨论】:

  • 您介意在问题中包含什么是真正的模运算或链接吗?
  • 在这个问题的上下文中,我所说的“模数”运算在此处返回称为“r”的数字:en.wikipedia.org/wiki/Euclidean_division。像 Common Lisp 的 MOD(与 REM 相对)。或者 Ruby 的 Fixnum#%(而不是 Numeric#remainder)。这两种操作都很重要,对于一种语言来说,支持一种而不支持另一种是一个弱点。

标签: sql postgresql


【解决方案1】:
SELECT MOD(24 + MOD(-2, 24), 24);

将返回 22 而不是 -2

【讨论】:

  • 好的。我还没有尝试过,但是如果第一个操作数是正数,这似乎也有效。不错!
【解决方案2】:

看来我找不到比这更简单的了:

CREATE OR REPLACE FUNCTION modulus(dividend numeric, divisor numeric) RETURNS numeric AS $$
DECLARE
  result numeric;
BEGIN
  divisor := ABS(divisor);
  result  := MOD(dividend, divisor);
  IF result < 0 THEN
    result := result + divisor;
  END IF;
  RETURN result;
END;
$$ LANGUAGE plpgsql;

【讨论】:

  • DBMS 供应商似乎同意这里:Oracle、SQL Server 和 MySQL 返回与 Postgres 相同的东西。我想知道这是否在 SQL 标准中以某种方式指定
  • 我可以找到更短的解决方案,请参阅我的答案
【解决方案3】:

只是对 a_horse_with_no_name 提出的附带问题的迟来的回答: 是的,这是在 SQL 标准中指定的。并且提到的供应商都遵守了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多