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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

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

Q&A

解決済

2回答

1883閲覧

bit管理について

dthani

総合スコア131

PostgreSQL

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

0グッド

0クリップ

投稿2015/05/21 02:02

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

下記サイトで、
http://blog.asial.co.jp/683
金のデータを取得したい場合、512とすると、金のデータしか取れない
わけですよね。金を含んだデータを取る場合は、
どうすればよいのでしょうか?

それを取得するための自作関数があれば教えてください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

例えば変数vが金を含んでいるかチェックしたい場合、v & 512 が0ならば金を含んでいない、0以外ならば金を含んでいます。
また、変数vに金を含ませる場合は、v | 512とします。

&|の演算子は多くの言語にあると思います。

投稿2015/05/21 02:12

編集2015/05/21 02:13
naga3

総合スコア1293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/05/21 02:41

ご回答ありがとうございます。 SQL文で書くイメージがつかないのですが、下記の通りでしょうか? [select文] 金を含んでいる select * from t_sample where v <> v & 512 select * from t_sample where v = v | 512 金を含んでいない select * from t_sample where v = v & 512 [update] 金を含ませる update t_sample set v = v | 512 金を除く ←金がそもそも無い場合は、変な値になりそうな? update t_sample set v = v - 512 ??
naga3

2015/05/21 02:55

すみません、プログラミング言語で処理することしか考えてなかったので SQLでは試していないのですが、以下のような感じでしょうか。 [select文] 金を含んでいる select * from t_sample where v = v | 512 金を含んでいない select * from t_sample where v = v & 512 [update] 金を含ませる update t_sample set v = v | 512 金を除く update t_sample set v = v & 511 間違ってたらすみません。
naga3

2015/05/21 02:58

間違えました。金を含んでいないは select * from t_sample where v & 512 = 0 あと金が最大bitでないとき、金を除くの511が変わってくるので注意してください。
dthani

2015/05/21 02:59

ありがとうございます。 実際に作って確認します。
dthani

2015/05/21 03:01

すみません。 「あと金が最大bitでないとき、金を除くの511が変わってくるので注意してください。」の意味がよくわかりません。 512ではなくて、511ですか?
naga3

2015/05/21 03:10

bitで考えると 512は1000000000 511は0111111111 つまり511とのandを取ると最上位ビットが必ず0になって金を除けます。
dthani

2015/05/21 03:32

すみません。わかりません。 金の次に何かあるとき(金が最大でないとき)、 512は01000000000 511は00111111111 511のandは、これですよね。 01111111111 そうすると、金より上のものを取得という風になりませんか? sql文で書くとするとこのような感じでしょうか? select * from t_sample where v & 512 = 0 and v & 511 = 0
naga3

2015/05/21 03:40

金の次に何かあるときは 10111111111 このように512以外のbitを全部立ててください。 そうすれば512のみを取り除けます。 今思ったのですが、NOT使ったほうが良かったかもしれません。 つまり v = v & ~512
naga3

2015/05/21 04:09

すみません、金を除く回答で511は不正確なので無視してください。 やはり実際にやってみないとダメなのでMySQLでやってみました。 NOTを使うのが正解のようです。 CREATE TABLE test(bit INT); INSERT INTO test(bit) VALUES(16); → (とりあえず適当にbitを立てる) SELECT * FROM test WHERE bit=bit|512; → 0行(金のbitは立っていない) update test set bit=bit|512; → 528(512 + 16、金を含ませた) SELECT * FROM test WHERE bit=bit|512; → 1行(金のbitがたった) update test set bit=bit&~512; → 16(金を除いた)
dthani

2015/05/21 05:13

ご回答ありがとうございます。 助かります。
guest

0

PostgreSQLの場合、データベースエンジン側でビット型をサポートしているので、下手に自分で書かずにそれを使ってみるのも1つの方法です(8.0のマニュアルより)。

投稿2015/05/21 02:10

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/05/21 02:44

そのbit型のselect文、update文は、同様に「&、|」を使用するのでしょうか? SQL文の例を教えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問