2017-08-01 68 views
1

我有這樣的代碼在觸發器:PosgreSQL 9.3操作者<>犯規給予邏輯結果

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 

我不明白這種行爲。這裏發生了什麼?

+0

你可能感到困惑'NULL's,而且也應該使用'是不同的from',而不是'<>'。 –

+0

@GordonLinoff這裏沒有空位。我用傑克問這個具體的比較傑克:「對於非空輸入,IS DISTINCT FROM與<>運算符相同。」 https://www.postgresql.org/docs/9.0/static/functions-comparison.html – avi

+0

out of curiocuty,添加BEFORE UPDATE觸發器並檢查相同嗎? –

回答

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) 
+0

Omg!我從來沒有猜到這是問題所在。謝謝。但我不知道我明白爲什麼'select'jack':: citext <>'Jack':: citext'給出'false'。 – avi

+1

如果至少有一個比較(不是輸入,如果是左或右)是「citext」,則它對兩個比較值都執行「較低」 –