SAP SQL Anywhere で BIT VARYING データ型を使用する (過去のブログより)
このページは、以下の英語ページの抄訳です。最新の情報については、英語ページを参照してください。
https://blogs.sap.com/2014/04/23/using-the-bit-varying-data-type/
この記事のオリジナルは、Glenn Paulley が sybase.com に 2009 年 7 月 に掲載したものです。その中で、Glenn は、SQL Anywhere における VARBIT データ型について解説しています。
ANSI/ISO 標準 SQL では、SQL:2003 から正式にBIT
と BIT VARYING
データ型が外されました。BIT_LENGTH()
関数を含め、これらを正式にサポートしていたのは、SQL:1999 までです。標準 SQL:2003 では、TRUE や FALSE といった真理値用に BOOLEAN
型が維持されています。
ビット文字列配列によって提供される機能は、多くのインスタンスで役に立ちます。標準 SQL:2003 からはBIT VARYING
型がなくなったとはいえ、SQL Anywhere では、version 10 以降でBIT VARYING
型をサポートしています。BIT VARYING
用の追加のショートハンドのVARBIT
とともに以下の型の宣言がビット文字列配列用にサポートされています。
BIT VARYING [ ( length ) ]
LONG BIT VARYING
長さが指定されていない場合には、デフォルトでは 1 に設定されています。LONG BIT VARYING
カラムは、最長 2GB の BLOB で構成されています。
SQL Anywhere では、単一の値の BIT
型は、標準 SQL の BOOLEAN
型のシノニムとして使用することが可能です。
BIT VARYING スカラと集合関数
BIT VARYING
とLONG BIT VARYING
型は、以下のスカラ関数を使用して操作することが可能です。
BIT_LENGTH()
– ビット文字列の長さを返します。この関数は、文字列のビット数を返すSQL:1992 からの BIT_LENGTH() 関数と同じセマンティクスは持っていないことに留意してください。そのため、以下のクエリでは、SELECT BIT_LENGTH( '01101011' );
値は、( 0′ と 1′ )の並びが文字列として翻訳される SQL:1992 の
BIT_LENGTH()
のセマンティクスを使用する) 64 ではなく、(引用符内のこの string は、Binary String として翻訳される) 8 を返します。BIT_SUBSTR( bit-expression [, start [, length ] ] )
– ビット配列の部分文字列を返します。COUNT_SET_BITS( bit-expression )
– ビット配列の中の番号の ‘1’ ビットを返します。GET_BIT( bit-expression, position )
– 配列内の特定のポジションのビットのビット値を返します。SET_BIT([ bit-expression, ]bit-position [, value ])
– 値に対するあるポジションの値を設定します。デフォルトの値は ‘0’ です。SET_BIT()
は、修正されたビット文字列を含むLONG VARBIT
表現を返します。bit-expression が特定されていない場合には、ビット文字列は、デフォルトでは「ポジション」の長さの ‘0’ ビットの string になります。
そして、以下の集合関数によって
BIT_AND( expression )
は、 複数の行からの継続的なビット配列値のビット単位のAND を実行する集合関数です。例えば、クエリSELECT BIT_AND( CAST(row_value AS VARBIT) ) FROM dbo.sa_split_list('0001,0111,0100,0011')
は、ビット配列 ‘0000’ を返します。なぜならば、4 つの値のビット単位 AND は、すべて ‘0’ のビット列を生成するからです。
BIT_OR()
とBIT_XOR()
は、ビット単位の OR と XOR オペレーションをそれぞれ実行するBIT_AND()
に似ています。SET_BITS( integer-expression )
集合関数は、VARBIT
配列とともにグループ内のそれぞれの行の表現の integer 値に相応してビットポジションの設定を ‘1’ で返します。例として、以下の文では、2番目、5番目、10番目のビットのビット配列を、1 (または 0100100001) に設定して返します。CREATE TABLE T( x INTEGER ); INSERT INTO T values( 2 ); INSERT INTO T values( 5 ); INSERT INTO T values(10 ); SELECT SET_BITS( x ) FROM T;
BIT VARYING への型のコンバージョン
他の型からBIT VARYING
へのコンバージョンにおいて、SQL Anywhere はできる限り直感的なコンバージョンを試みます。SQL Anywhere のマニュアルに詳細な説明がありますが、いくつかここに例を挙げます。
INTEGER
からBIT VARYING
: integer をビット配列にコンバートする場合、ビット配列の長さは、integer 型のビットの長さです。そして、ビット配列の値は、integerのバイナリを表します。Integer の最も重要なビットは、配列の最初のビットになります。SELECT CAST( CAST( 8 AS TINYINT ) AS VARBIT )
は、‘00001000’ を含む
VARBIT(8)
を返します。BINARY
からBIT VARYING
: 長さ n の binary 型をビット配列にコンバートする場合、配列の長さは n * 8 ビットです。ビット配列の最初の 8 ビットは、バイナリ値の最初のバイトになります。バイナリ値の最も重要なビットは、配列の中の最初のビットになります。ビット配列の次の 8 ビット は、バイナリ値の 2 番目のバイトになります。以降も同様です。SELECT CAST( 0x8181 AS VARBIT )
は、’1000000110000001′ を含む
VARBIT(16)
を返します。CHAR
またはVARCHAR
からBIT VARYING
: 長さ n の character データ型をビット配列にコンバージョンする場合、配列の長さは n ビットです。それぞれの character は、’0′ または ‘1’ でなければならず、相応する配列のビットには、0 または 1 の値が割り当てられます。SELECT CAST( '001100' AS VARBIT )
は、’001100′ を含む
VARBIT(6)
を返します。BIT VARYING
からINTEGER
: ビット配列 を integer データ型にコンバートする場合、ビット配列のバイナリ値は、最も重要なビットを最初に使用して、integer 型のストレージフォーマットに従って翻訳されます。SELECT CAST( CAST( '11000010' AS VARBIT ) AS INTEGER )
は、integer 値 194 (110000102 = 0xC2 = 194) を返します。
sa_get_bits() システムプロシージャー
SET_BITS()
集合関数の dual は、ビット配列内のそれぞれのビット用に行を生成するシステムプロシージャー sa_get_bits()
で、(オプション的に、そしてデフォルトで) ビットポジションが ‘1’ であるものにだけ行を生成することができます。以下は、その値に関わらず、インプット表現の中のそれぞれのビットポジションのために行を生成する例です。
===
SAP SQL Anywhere に関する詳細情報は、SAP SQL Anywhere Communityページ<英語> を参照してください。
上記のコミュニティーに掲載されている技術情報は、順次SQL Anywhere 日本語コミュニティ
に掲載しています。
SQL Anywhere に関してはまずはこちらをご参照ください。無期限でご利用いただける無償の Developers Edition もこちらからダウンロードが可能です。
SQL Anywhere に関して技術的な質問のある方はコミュニティに登録し、
「Ask a Question」機能をご利用ください。
Language には「Japanese」、
Primary Tag には「SAP SQL Anywhere」を選択
User Tagに「sql anywhere」「sql anywhere Japanese question」
を入力してください。
不具合につきましては、サポート契約者様専用の問い合わせ方法にてお問い合わせください。
======================
ご購入に関するお問い合わせ
こちらよりお問い合わせください。