質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • PostgreSQL

    1101questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

[postgresql]新しい演算子の作成について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,312

dthani

score 130

下記ビット管理の質問について、
https://teratail.com/questions/10131

ビット値で、特定の値を除く方法として、
下記の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です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

※手元にバージョン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文書
https://www.postgresql.jp/document/9.3/html/sql-createoperator.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/14 14:41 編集

    ご回答ありがとうございます。
    上記の通り演算子を定義して、
    「~~」でバインド変数で上手く行きました。
    ※ドキュメントもそれに近いバージョンを参照するようにします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    【postgreSQL】timestamp型でnullを空白文字に変えたい

    こんばんは。 SQL書いているのですが、躓いてしまったので質問させていただきます。 データ型がtimestamp型のカラムのnullを空白文字に変換しようとしております。 現

  • 解決済

    PostgresSQLでのスキーマ検索パス

    PostgreSQLでスキーマ別にテーブル(オブジェクト)を振分けしたいと考えています。 スキーマ検索パスの先頭に、ログインユーザが自動セットされるのはわかるのです。 しかし、ス

  • 解決済

    DB設計について

    1画面に複数選択のチェックボックスを作成する際の DB設計について質問です。 例えば、10個のチェックボックスがある場合、 設計の仕方は色々あると思いますが、チェックボックスの

  • 解決済

    bit管理について

    下記の質問で出てきたビット管理について質問です。 https://teratail.com/questions/10017 下記サイトで、 http://blog.asial.c

  • 解決済

    PostgreSQLに複数のCSVをインポート

    前提・実現したいこと 毎日他のシステムで作成される日本語ヘッダ付きCSVをDBサーバーに置き 夜間バッチでディレクトリ内のCSV全てインポートしたいです。 ご教示くださいますよ

  • 解決済

    【SQL】連番を1からではなく、100などから始めたい場合

    Updateでやる方法はわかったのですが、INSERTでは可能でしょうか? 連番のカラムは、現状シーケンスになっています。

  • 解決済

    DBに画像を入れたい。

    ●環境 OS:Windows Server2012 R2 SQL:PostgreSQL(9.5.11) ・DB名:IMG_TEST ・テーブル名:IMG_TEST_TA ・テー

  • 解決済

    Postgre 結合したテーブル同士で該当の条件に合えばUPDATE(日付を加算したい)

    テーブルAにはstorecode deadlinflg テーブルBにはstorecode month、monthdeadline 上記のカラムをそれぞれ持っています テーブルA

同じタグがついた質問を見る

  • PostgreSQL

    1101questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。