【问题标题】:PostgreSQL 9.3 operator <> doesn't give logical resultPostgreSQL 9.3 运算符 <> 不给出逻辑结果
【发布时间】:2017-08-01 15:25:21
【问题描述】:

我在触发器中有这段代码:

CREATE TRIGGER customernametrig
  AFTER UPDATE
  ON customers
  FOR EACH ROW
  EXECUTE PROCEDURE  trig();

和功能:

CREATE OR REPLACE FUNCTION trig()
  RETURNS trigger AS
$BODY$
begin
   if TG_OP='UPDATE' then
    RAISE NOTICE '%', new.customername;
    RAISE NOTICE '%', old.customername;
    RAISE NOTICE '%', new.customername<>old.customername;
    if new.customername<>old.customername then
        RAISE NOTICE 'hi';
    end if;
  end if;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE

customername 列的类型为 citext。

当我运行更新命令时

Update customers set customername='Jack' where customerid=125;  

它打印的字段:

NOTICE:  Jack
NOTICE:  jack
NOTICE:  f

但如果我运行select 'jack'&lt;&gt;'Jack',它会给我:t

所以我期望它打印的是:

NOTICE:  Jack
NOTICE:  jack
NOTICE:  t
NOTICE:  hi

我不明白这种行为。这里发生了什么?

【问题讨论】:

  • 您可能对NULLs 感到困惑,可能应该使用is distinct from 而不是&lt;&gt;
  • @GordonLinoff 这里没有空值。我在询问 Jack 与 jack 的这个特定比较:“对于非空输入,IS DISTINCT FROM 与 运算符相同。” postgresql.org/docs/9.0/static/functions-comparison.html
  • 出于好奇,添加 BEFORE UPDATE 触发器并检查是否相同?..
  • @VaoTsun 该表有 25 列,其中大部分为空。我为我的支票创建了一个“细长”行,这也发生在这一行中。基本上我只有客户ID和客户名称。所以你可以创建 customerid integer , customername citext。
  • citext 不区分大小写 - 所以它的预期结果 - 我觉得有这样的东西 - 所以设置为 'Vao' 应该 RAISE hi

标签: sql postgresql plpgsql database-trigger


【解决方案1】:

https://www.postgresql.org/docs/current/static/citext.html

citext模块提供了不区分大小写的字符串类型

...

citext 通过将每个字符串转换为小写来执行比较 (好像调用了lower)然后正常比较结果。 因此,例如,两个字符串被认为是相等的,如果 lower 将 为它们产生相同的结果。

t=# select 'jack'<>'Jack';
 ?column? 
----------
 t
(1 row)

t=# select 'jack'::citext<>'Jack';
 ?column? 
----------
 f
(1 row)

【讨论】:

  • 天哪!我永远不会想到这是问题所在。谢谢。但我不确定我理解为什么select 'jack'::citext&lt;&gt;'Jack'::citextfalse
  • 如果至少有一个比较(不重要,如果左或右)是citext,它对两个比较值执行lower
猜你喜欢
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 2018-09-20
  • 2012-08-22
  • 2020-12-20
相关资源
最近更新 更多