2012-04-18 28 views
0

我想在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查詢中完成此操作。

+0

它一定是遲到了,但是你能簡化一下,或者只是在最後重新提出這個問題嗎?我這樣說是因爲我不明白你在問什麼。 – 2012-04-18 16:34:32

+0

那麼,我想要做的就是能夠把X'pd.serial'並讓它理解我正在嘗試做什麼。不幸的是,因爲pd.serial(包含數據的列)被包裝在單引號中,查詢將其視爲文字字符串。這有助於澄清嗎? – 2012-04-18 16:40:57

回答

0

X'...'是sqlite中的二進制表示。如果這些值是字符串,那麼您可以直接使用它們。

這應該是一個開始:

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

我希望讓你在正確的道路上。

+0

對,我一直在做手動顯示,並按照我想要的方式轉換數據。 (很好的提示擺脫了前面的零,順便說一句!)但我有300+條目在我的表中,我需要得到他們每個人的二進制表示,並輸出結果。 – 2012-04-18 17:23:51