0

私はpostgresでクエリを見つけようとしていますが、その原因がわかりません.mysqlに慣れていて、postgresにはLIKEクエリがありません. または私の取引は何ですか。いずれにせよ、私はそれが機能していないことを知っており、その理由がわかりません。誰かが私を正しい方向に向けるのを手伝ってくれますか? 最終的には、このクエリの Zend Database バージョンを作成しようとしていますが、これは、zend db クラスを使用して構築する前に試して作成するコアクエリです。

SELECT 
    org.orgid, 
    org.roleid, 
    users.userid, 
    users.email, 
    users.first_name, 
    users.last_name, 
    users.contact_id, 
    users.state, 
    users.ts, 
    users.altemail, 
    users.unboundid, 
    users.blocked 
FROM mapping AS org 
INNER JOIN my_users AS users ON org.userid = users.userid
WHERE (org.orgid = 'generated-id')
AND (org.roleid LIKE 'partner-%');



ERROR:  operator does not exist: roles ~~ unknown
LINE 17: AND (org.roleid LIKE 'partner-%');
                          ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
4

1 に答える 1

1

変化する

AND (org.roleid LIKE 'partner-%');

AND (org.roleid::text LIKE 'partner-%');

明らかに、ロール ID のテキスト表現に取り組んでいます。データ型が一致しない場合を除いて、これは正常に機能するはずです。テキストにキャストすることで、確実にキャストできます。

重要な影響の 1 つは、roleid のインデックスは、その操作が型と直接互換性がないため、このような比較には役に立たないということです。orgid は引き続きインデックスを使用できるため、これは問題にはなりませんが、考慮すべき事項です。それを修正したい場合は、テーブル メソッドまたは他の関数を使用してこれを分解することをお勧めします。その後、関数の出力にインデックスを付けることができます。

たとえば、次のようにテーブル メソッドを使用できます。

CREATE FUNCTION is_partner(mapping) returns bool language sql immutable as $$
    SELECT $1.roleid::text LIKE 'partner-%';
$$;

次に、次の方法でインデックスを作成できます。

CREATE INDEX mapping_is_partner_idx ON mapping (is_partner(mapping));

次に、その結​​合条件を次から変更できます

AND (org.roleid LIKE 'partner-%');

AND org.is_partner;

この場合、org が必要であり、class.method 表記を使用して org.is_oartner を is_partner(org) に変更するため、暗黙的に追加できないことに注意してください。

お役に立てれば。

于 2012-10-09T00:51:25.597 に答える