sql - PostgreSQL 9.3 operator <> 没有给出逻辑结果

标签 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

我不理解这种行为。这里发生了什么?

最佳答案

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

The citext module provides a case-insensitive character string type

...

citext performs comparisons by converting each string to lower case (as though lower were called) and then comparing the results normally. Thus, for example, two strings are considered equal if lower would produce identical results for them.

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

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

关于sql - PostgreSQL 9.3 operator <> 没有给出逻辑结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45441840/

相关文章:

sql - 使用另一个查询的输出动态执行查询

mysql - 更新组中最早的行

Mysql 根据值更新并选择查询

mysql - 是否可以简化此 SQL UNION 查询?

python - 如何使用 psycopg2/python 处理这个驼峰式 postgreSQL 查询?

ruby-on-rails - Postgres 到 ActiveRecord 查询以进行自定义验证

sql - PostgreSQL - 如何在函数中动态执行查询并返回表

ruby - 如何使用 Sequel ORM 对同一个表中的一列求和以生成三个不同的聚合?

postgresql - 使用两个变量查找唯一值

postgresql - 冲突列上的 Postgres 10 与返回表中的列同名 = 不明确