我想在Spiceworks中使用SQLite查詢編寫自定義報告。這份報告將取得我硬盤驅動器的序列號,不幸的是,這些序列號是以幾種不同的方式存儲的,這取決於機器上的Windows和WMI版本。帶列數據的SQLite X'...'表示法
三種常見的例子(這是足以讓實際問題)如下:
實際編號:5VG95AZF
十六進制字符串的前導空格:2020202057202d44585730354341543934383433
十六進制字符串前導零:3030303030303030313131343330423137454342
這兩個十六進制字符串是進一步即使在它們被轉換成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'
這表明X'....'
符號樣式在給定完全字面數字(202020%線)時會轉換爲W -DXW05CAT94843
的正確(但倒退)結果。但是,我需要找到一種方法來對列pd.serial
中的實際數據做同樣的事情,但我找不到方法。
我最初的想法是,如果我可以構建X'...'
表示法的字符串表示形式,那麼cast()
可能會對它進行評估。但正如你所看到的那樣,結果只是吐出了X'3030303030303030313131343330423137454342'
而不是預期的00000000111430B17ECB
。這意味着級聯工作正常,但我無法找到一種方式來評估它,因爲十六進制與手動測試用例中的一樣。
我一直在使用googling來查看是否只有一些我缺少的語法,但最接近的是我使用||
運算符進行了這種連接。
編輯:最後我只想能有一個簡單的case語句在我的查詢是這樣的:
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中的嵌入式報表,所以我必須在單個SQLite查詢中完成此操作。
它一定是遲到了,但是你能簡化一下,或者只是在最後重新提出這個問題嗎?我這樣說是因爲我不明白你在問什麼。 – 2012-04-18 16:34:32
那麼,我想要做的就是能夠把X'pd.serial'並讓它理解我正在嘗試做什麼。不幸的是,因爲pd.serial(包含數據的列)被包裝在單引號中,查詢將其視爲文字字符串。這有助於澄清嗎? – 2012-04-18 16:40:57