2013-04-24 7 views
5

私はSQL Server 2008を使用しています。TestDatabinaryという列があります。 TESTDATA列でSQL Serverのようなものを使用してバイナリ列をクエリ

サンプルデータが

1. 0x0001DC780C0030373156635D0C00B8840301009A0600AC 
2. 0x0301DC780C0030373156385D0C006499C401009A0600AC 

は、テストデータが「0x0001の」で始まる行を取得するために2つのクエリの下に書いています。しかし、誰も働いていません。 (あなたが値をDATETIMEますように)

​​

期待される結果に

+0

2つのクエリはまったく同じですか?また、2面ワイルドカードLIKEを行うための説明とコードを追加しました。 – RichardTheKiwi

答えて

9

を取得するクエリを修正してください

DECLARE @foo TABLE (TestData varbinary(100) NOT NULL); 
INSERT @foo (TestData) VALUES 
     (0x0001DC780C0030373156635D0C00B8840301009A0600AC), 
     (0x0001AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA), 
     (0x0001AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF), 
     (0x0301DC780C0030373156385D0C006499C401009A0600AC), 
     (0x0301FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF), 
     (0x0302000000000000000000000000000000000000000000); 

SELECT * 
FROM @foo 
WHERE TestData >= 0x0001 AND TestData < 0x0002; 

-- added more digit for clarity of what actually happens 
SELECT * 
FROM @foo 
WHERE TestData >= 0x00010000 AND TestData < 0x00020000; 

SELECT * 
FROM @foo 
WHERE TestData >= 0x0001AA AND TestData < 0x0001AB; 

SELECT * 
FROM @foo 
WHERE TestData >= 0x0301 AND TestData < 0x0302; 

それを変換しますが、治療を範囲としてあるしないでくださいこれはボーナスを持っていますTestDataでインデックスを使用できることの

編集すると、必要なだけ多くの桁を指定します

+0

検索したいときはどうすればいいですか?** '0x0301%' '** – Luv

+0

@Luv:もっと多くの例が追加されました – gbn

+0

+1。 **素敵なロジック** – Luv

1

先頭の接頭辞LIKE比較では、gbnの答えが適用されます。
(@gbnからの借入スキーマおよびサンプルデータ)

DECLARE @foo TABLE (TestData varbinary(100) NOT NULL); 
INSERT @foo (TestData) VALUES 
     (0x0001DC780C0030373156635D0C00B8), 
     (0x0001AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA), 
     (0x0001AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF), 
     (0x0301DC780C0030373156385D0C006499C401009A0600AC), 
     (0x0301FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF), 
     (0x0302000000000000000000000000000000000000000000); 

SELECT * 
FROM @foo 
WHERE CAST(TestData AS VARCHAR(MAX)) LIKE '%'+CAST(0xDC78 AS VARCHAR(MAX))+'%'; 

をあなたはVARCHARにバイナリ値をキャストすると、すべてのことを次のように文字列検索の等価LIKE リアルためには、LIKEを使用することができます生のビットを文字列ストリームとして扱いますか?それは魔法のように文字列表現に変換されません。バイト0×41または序65は、標準的なラテン語のコードページでは「A」であるので

select cast(0x41 as varchar(10));  -- Result: A 
select cast(0x414263 as varchar(10)); -- Result: ABc 

:以下の例を考えてみましょう。

関連する問題