PostgreSQL 9.3运算符<>不给出逻辑结果

时间:2017-08-01 15:25:21

标签: sql postgresql plpgsql database-trigger

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

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'<>'Jack',它就会给我:t

所以我期望它打印出来的是:

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

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

1 个答案:

答案 0 :(得分:1)

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

  

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

...

  

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

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

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