2012-04-18 2 views
0

SQLite 쿼리를 사용하는 Spiceworks에서 사용자 지정 보고서를 작성하려고합니다. 이 보고서는 컴퓨터에 설치된 Windows 및 WMI의 버전에 따라 여러 가지 방법으로 불행히도 저장되는 하드 드라이브 일련 번호를 가져옵니다. 다음과 같이 (실제 질문에 도착하기에 충분하다)SQLite X '...'표기법 열 데이터

세 가지 일반적인 예는 다음과 같습니다

실제 일련 번호 :5VG95AZF
선행 공백과 진수 문자열 :와2020202057202d44585730354341543934383433
진수 문자열 선행 0 :3030303030303030313131343330423137454342

두 개의 16 진수 문자열이 더 깁니다 r은 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'을 뱉어 버립니다. 이것은 연결이 올바르게 작동하고 있음을 의미하지만 수동 테스트 경우와 마찬가지로 16 진수로 평가할 수있는 방법을 찾을 수 없습니다.

제가 누락 된 일부 구문이 있는지를 확인하기 위해 하루 종일 인터넷 검색을하고 있지만 가장 가까운 곳은 || 연산자를 사용하는 연결입니다.

편집 : pd.serial은 작은 따옴표로 감싸 도착하기 때문에

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 

하지만, 그것이으로한다 : 궁극적 난 그냥 이런 내 쿼리에서 간단한 경우 문이 할 수 있도록하려면 리터럴 문자열 대신 해당 열에 포함 된 데이터로 사용됩니다. 내 희망은/문자가 같거나 지정해야 할 연산자가 있다는 것입니다 (예 : X'$pd.serial' 또는 뭔가).

최종 편집

나는이 첫 번째 장애물 과거를 얻을 수 있다면, 내 옆에 작업을 시도하고 (LTRIM는 선행 공백을 먹는 방법을) 앞에 오는 0을 제거하고 바이트를 반전 할 수 있지만 수 솔직히, Excel에서이 보고서를 후 처리하는 것이 어렵지 않기 때문에 그 부분이 불가능할지라도 나는 만족할 것입니다.

누구나 올바른 방향으로 나를 가리킬 수 있다면 크게 감사하겠습니다! 이 처리를 위해 PHP 나 다른 것을 사용하는 것이 분명 훨씬 쉬울 것이지만 Spiceworks의 임베디드 보고서가되기 위해 모든 SQLite 쿼리에서이 작업을 수행해야합니다.

+0

늦어 질 것입니다. 그러나 단순화 할 수 있습니까, 아니면 단지 이전에 온 모든 것의 종합처럼 마지막에 질문을 다시 할 수 있습니까? 나는 당신이 정확히 무엇을 요구하는지 이해하지 못하기 때문에 이것을 말하고 있습니다. –

+0

글쎄, 내가하고 싶은 것은 X'pd.serial '을 넣을 수 있고 내가하려고하는 것을 이해할 수있을 것이다. 유감스럽게도 pd.serial (데이터가있는 열)은 작은 따옴표로 묶여 있기 때문에 쿼리는이를 리터럴 문자열로 처리합니다. 그게 도움이 명확한가? –

답변

0

X '...'는 sqlite의 이진 표현입니다. 값이 문자열 인 경우 해당 값을 그대로 사용할 수 있습니다. 나는 이것이 옳은 길에 당신을두고 희망

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

:

는 시작해야합니다.

+0

맞아요, 제가 보여준대로 수동으로 해왔고, 그것은 제가 원하는 방식으로 데이터를 변환합니다. (좋은 0, btw 제거에 좋은 팁!)하지만 내 테이블에 300 + 항목이 있고 각각의 이진 표현을 얻고 결과를 출력해야합니까. –