質問: 下記ビット管理の質問について、 ビット値で、特定の値を除く方法として、 下記のSQLで処理できますが、 update test set b=b & ~ B'0000000010' ※項目bは、bit varying(10) B'0000000010'の部分を下記の通り、バインド変数にして実行したとき、 update test set b=b & ~ :aa 「演算子は一意ではありません: ~ unknown」というエラーになります。(A5:Mk-2のツールで実行した結果です。) ※演算子が二つあるのでエラーになっていると思います。 よって、下記のサイトに書いてある通り、 演算子を新しく定義できるようなのですが、 書き方が良くわかりません。 というより、「& ~」を別の英文字などで定義できるのでしょうか? ご存知の方、お教えください。 https://www.postgresql.jp/document/8.2/html/sql-createoperator.html ※ストアドファンクション内でやった場合は上手くいくので、 新しい演算子の作成が出来ない場合は、ストアドファンクションでやろうと思っています。 postgresqlバージョンは、9.3.4です。
回答: ※手元にバージョン`9.4.5`しか無いので、`9.3.4`でどうなるか分かりません。ご了承ください。 ビット列同士の二項演算子を定義してみました。 ただ、これでバインド変数の場合に上手く行くのかどうかは確認していません。 あと、私もあまり関数や演算子については詳しくないので、ごく基本的な項目しか設定していません。 まず引数を2つ取る関数(`and_not`)を定義して、演算子(`~~`)からはそれを呼び出すようにします。 ``` CREATE FUNCTION and_not(bit varying, bit varying) RETURNS bit varying AS 'select $1 & (~ $2);' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT ; CREATE OPERATOR ~~ ( LEFTARG = bit varying, RIGHTARG = bit varying, PROCEDURE = and_not ); -- 確認 select B'0000011111' ~~ B'0000000010'; -- => B'0000011101' ``` なお、`9.3.4`をお使いとのことですので、ドキュメントもそれに近いバージョンのものを参照したほうが良いと思います。 CREATE OPERATOR - PostgreSQL 9.3.2文書