SQLite X '…' нотация с данными столбца

Я пытаюсь написать собственный отчет в Spiceworks, который использует запросы SQLite. В этом отчете я получу серийные номера жестких дисков, которые, к сожалению, хранятся несколькими различными способами в зависимости от того, какая версия Windows и WMI была на компьютере.

Вот три общих примера (которых достаточно, чтобы перейти к актуальному вопросу):

Actual serial number: 5VG95AZF
Hexadecimal string with leading spaces: 2020202057202d44585730354341543934383433
Hexadecimal string with leading zeroes: 3030303030303030313131343330423137454342

Две шестнадцатеричные строки еще более усложняются тем, что даже после преобразования их в представление ASCII каждая пара чисел фактически обратна. Вот пример:

3030303030303030313131343330423137454342 оценивает00000000111430B17ECB

Однако фактический серийный номер на этом жестком диске1141031BE7BCбез начальных нулей и с байтами, поменяными местами. Согласно другим вопросам и ответам, которые я прочитал на этом сайте, это связано с & quot; endianness & quot; данных.

Пока что мой временный запрос выглядит примерно так (сокращено только до соответствующего раздела):

<code>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
</code>

Результат этого запроса выглядит примерно так:

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

Это показывает, чтоX'....' стиль обозначения конвертируется в правильный (но обратный) результатW -DXW05CAT94843 когда дано полностью буквальное число (линия 2020-20%). Тем не менее, мне нужно найти способ сделать то же самое с фактическими данными в столбце,pd.serialи я не могу найти способ.

Первоначально я думал, что если бы я мог построить строковое представлениеX'...' обозначение, то, возможно,cast() оценил бы это. Но, как вы можете видеть, это просто выплевываетX'3030303030303030313131343330423137454342' вместо ожидаемого00000000111430B17ECB, Это означает, что конкатенация работает правильно, но я не могу найти способ оценить его как шестнадцатеричный, такой же, как в ручном тестовом примере.

Я гуглил все утро, чтобы посмотреть, есть ли какой-то синтаксис, который мне не хватает, но ближе всего я пришел к этой конкатенации с использованием|| оператор.

EDIT:  В конечном счете, я просто хочу, чтобы в моем запросе была простая инструкция case:

<code>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
</code>

Но поскольку pd.serial заключен в одинарные кавычки, он воспринимается как буквенная строка, а не как данные, содержащиеся в этом столбце. Я надеялся, что нужно указать только символ или оператора, напримерX'$pd.serial' или что-то.

END EDIT

Если я смогу преодолеть это первое препятствие, моей следующей задачей будет попытка удалить начальные нули (то, как LTRIM потребляет начальные пробелы) и поменять местами байты, но, если честно, я был бы доволен, даже если эта часть не является & apos; это невозможно, поскольку для этого не составит труда постобработать этот отчет в Excel.

Если кто-нибудь может указать мне правильное направление, я был бы очень признателен! Очевидно, было бы намного проще, если бы я использовал PHP или что-то еще для этой обработки, но поскольку я пытаюсь сделать это встроенным отчетом в Spiceworks, я должен сделать все это в одном запросе SQLite.

Ответы на вопрос(1)

Ваш ответ на вопрос