1

SQLite クエリを使用する Spiceworks でカスタム レポートを作成しようとしています。このレポートはハード ドライブのシリアル番号を取得しますが、残念ながらマシンにインストールされている Windows と WMI のバージョンに応じていくつかの異なる方法で保存されています。

3 つの一般的な例 (実際の質問に到達するのに十分です) は次のとおりです。

実際のシリアル番号: 5VG95AZF
先頭にスペースを含む 2020202057202d44585730354341543934383433
16 進文字列: 先頭にゼロを含む 16 進文字列: 3030303030303030313131343330423137454342

2 つの 16 進文字列はさらに複雑で、ASCII 表現に変換された後でも、数値の各ペアは実際には逆になっています。次に例を示します。

3030303030303030313131343330423137454342に評価されます00000000111430B17ECB

ただし、そのハード ドライブの実際のシリアル番号は1141031BE7BCで、先頭にゼロがなく、バイトがスワップされています。このサイトで読んだ他の質問と回答によると、これはデータの「エンディアン」に関係しています。

これまでの一時的なクエリは次のようになります (関連するセクションのみに短縮されています)。

SELECT  pd.model as HDModel,
  CASE
     WHEN pd.serial like "30303030%" THEN
         cast(('X''' || pd.serial || '''') as TEXT)
     WHEN pd.serial like "202020%" THEN
         LTRIM(X'2020202057202d44585730354341543934383433')
  ELSE
     pd.serial
  END  as HDSerial

そのクエリの結果は次のようになります。

HDModel             HDSerial
-----------------   -------------------------------------------
Normal Serial       5VG95AZF
202020% test case   W -DXW05CAT94843
303030% test case   X'3030303030303030313131343330423137454342'

これは、完全にリテラルな数値 (202020% の行) が与えられた場合に、X'....'表記スタイルが正しい (ただし逆方向の) 結果に変換されることを示しています。W -DXW05CAT94843しかし、列の実際のデータに対して同じことを行う方法を見つける必要があり、方法がpd.serial見つかりません。

X'...'私の最初の考えは、表記法の文字列表現を構築できれば、おそらくcast()それを評価するだろうということでした。X'3030303030303030313131343330423137454342'しかし、ご覧のとおり、それは予想されるのではなく、吐き出すだけ00000000111430B17ECBです。これは、連結が正しく機能していることを意味しますが、手動テスト ケースと同じように 16 進数として評価する方法が見つかりません。

不足している構文があるかどうかを確認するために午前中ずっとグーグルで検索してきましたが、最も近いのは||演算子を使用したこの連結です。

編集: 最終的には、クエリに次のような単純なケースステートメントを含めることができるようにしたいだけです:

SELECT  pd.model as HDModel,
  CASE
     WHEN pd.serial like "30303030%" THEN
         LTRIM(X'pd.serial')
     WHEN pd.serial like "202020%" THEN
         LTRIM(X'pd.serial')
  ELSE
     pd.serial
  END  as HDSerial

ただし、pd.serial は単一引用符で囲まれるため、その列に含まれるデータとしてではなく、リテラル文字列として取得されます。私の希望は、指定する必要がある文字または演算子X'$pd.serial'などがあることです。

編集終了

この最初のハードルを乗り越えることができれば、次のタスクは先頭のゼロを削除して (LTRIM が先頭のスペースを食べる方法)、バイトを逆にすることですが、正直なところ、その部分がそうでなくても満足です。このレポートを Excel で後処理するのは難しくないため、不可能です。

誰かが私を正しい方向に向けることができれば、私はそれを大いに感謝します! PHP などを使用してこの処理を行う方がはるかに簡単ですが、Spiceworks に埋め込まれたレポートにしようとしているため、これをすべて 1 つの SQLite クエリで行う必要があります。

4

1 に答える 1

0

X'...' は sqlite のバイナリ表現です。値が文字列の場合は、そのまま使用できます。

これは開始する必要があります:

sqlite> select X'3030303030303030313131343330423137454342';
00000000111430B17ECB
sqlite> select ltrim(X'3030303030303030313131343330423137454342','0');
111430B17ECB

これがあなたを正しい道に導くことを願っています。

于 2012-04-18T16:56:58.390 に答える