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.