- - PR -
HIRDBの組み込み関数
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-07-30 19:17
初めまして
HIRDBについてご質問です。 ある列(6バイト)のうち3バイト目から2バイトを取り出して、 その2バイトのコード(16進数表記)と0x40とのAND値が0の場合は正常とみなす。 という仕様を実現するためにはどのようなSQLを書けばいいのか どなたかお分かりでしょうか? プログラムはvb.netからODBC接続をしております。 よろしくお願いします。 | ||||||||
|
投稿日時: 2007-07-30 20:17
オンライン・マニュアルによれば、HiRDB は BIT_AND_TEST(値式1,値式2)組み込み関数があるようなのでこれを利用すれば簡単に出来るのではないでしょうか?
但し、それ以前に、2バイト文字と1バイトの 0x'40' の AND の定義があいまいです。 長いほうに合わせて 0x'0040' or 0x'4000' のどちらかと AND しますか?(もしそうなら、追加した 0x'00'との AND は常に 0x'00' なので無駄と思います)。または、短いほうに合わせて元の列の3バイト目と 0x'40' を AND しますか? | ||||||||
|
投稿日時: 2007-07-30 20:58
ありがとうございます!!
2バイト文字のほうも16進数表現です。 とすれば、 BIT_AND_TEST(hex(SUBSTR(dm_status,3,2)), x'40') is false というwhere条件句になるでしょうか? | ||||||||
|
投稿日時: 2007-07-31 05:23
HiRDBのマニュアルで確認してはいませんが、通常16進数表現でも1バイトは1バイトです。 すなわち、0x'0123' は 2バイトの文字、0x'40' は 1バイトの文字です。 例えば、2バイトの文字列 SUBSTR(dm_status,3,2)の値が 0x'0123' ならば、 hex(SUBSTR(dm_status,3,2)) とすると、4バイトの文字列 '0123' = 0x'30313233' になります(ASCII の場合)。 文字列の16進数表現の仕方を再確認されることをお勧めします。 [ メッセージ編集済み 編集者: とんくま 編集日時 2007-07-31 05:26 ] | ||||||||
|
投稿日時: 2007-07-31 09:07
いつもありがとうございます。
2バイトという表現が齟齬を生みそうなので補足します。 dm_status(varchar)の3バイト目から2バイトが16進数表記で格納されております。 dm_statusに'90F040'と入っている場合、 実際にSQLで抜き出すと'F0'となります。 このx'F0'とx'40'のAND値をとるという仕様です。 SUBSTR(dm_status,3,2)の方の記述を見直したほうがいいでしょうか? [ メッセージ編集済み 編集者: takuman 編集日時 2007-07-31 09:28 ] | ||||||||
|
投稿日時: 2007-07-31 16:50
SUBSTR で抜き出した文字 'F0' は2バイト文字( = x'4630')ですので、BIT_AND_TEST を直接使うには 'F0' を x'F0' に変換する必要があるでしょう。 | ||||||||
|
投稿日時: 2007-07-31 17:08
ありがとうございます。
そうなんです。 この'F0' を x'F0'に変換する方法が分からないんです。 文字列連結ではできなさそうです。 何かご存知ですか? 今は保険でデータ取得後のVB.netでの実現も検討していますが・・・ | ||||||||
|
投稿日時: 2007-07-31 18:15
こんにちは。
データベースは守備範囲外ですが、 文字列と数値の変換のようなので参考までに。
大昔の常套手段で恐縮ですが(ご存知でしたらごめんなさい) 文字列→数値変換はVal関数でできます。この変換は10進数になりますので、 次に10進→16進変換を行うためHex$関数を使用します。 従って 16進数= Hex$(Val("&h" + "文字列")) という方法で実現できます。 この関数はVB2005でも動作しますよ。 もっとスマートな関数があると思いますが、 まず動かすのでしたらこれでいかがですか・・・ |