2017-08-01 4 views
1

を与えるIがトリガーでこのコードを持っている:PosgreSQL 9.3オペレータ<> doesntの論理結果を

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; 

フィールドupdateコマンドを実行します。だから私はそれを印刷することを期待何ですかt

を:

NOTICE: Jack 
NOTICE: jack 
NOTICE: f 

しかし、私はselect 'jack'<>'Jack'を実行する場合、それは私に与えます:

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

この現象はわかりません。ここで何が起きてるの?

+0

あなたはおそらくNULL's 'について混乱していると、おそらく'明確なfrom'の代わりに、 '<>'で使用する必要があります。 –

+0

@ GordonLinoffここにはnullはありません。私はこの特定のcomparsionジャックについてジャックで質問しています: "非NULL入力の場合、IS DISTINCT FROMは<>演算子と同じです。"待ち受け画面からhttps://www.postgresql.org/docs/9.0/static/functions-comparison.html – avi

+0

を削除して、BEFORE UPDATEトリガーを追加し、同じかどうかを確認してください。 –

答えて

1

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

citextモジュールは大文字と小文字を区別しない文字列型を提供

...

citextは、下部ケース (に、各文字列を変換して比較を行いますより低いが呼ばれた)、結果を通常と比較する。 したがって、例えば、2つの文字列は、 が同じ結果を生成する場合、等しいとみなされます。

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

少なくとも1つが(citextの)比較された(importではなく、左か右である)場合、両方の比較された値に対して 'lower'を実行します –

関連する問題