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 クエリで行う必要があります。