2013-04-24 63 views
5

我使用的是SQL Server 2008.在我的表中,我有一個名爲TestData的列binary。在TESTDATA列使用像在sql服務器中查詢二進制列

樣本數據

1. 0x0001DC780C0030373156635D0C00B8840301009A0600AC 
2. 0x0301DC780C0030373156385D0C006499C401009A0600AC 

寫下面兩個查詢來獲得其中TESTDATA以「×0001」開頭的行。但他們都沒有工作。

​​

請更正查詢得到預期的結果

+0

你的兩個查詢是完全一樣的嗎?此外,我添加了更多解釋和代碼來做一個雙面通配符LIKE的答案。 – RichardTheKiwi 2013-04-24 10:04:56

回答

9

不要轉換,但是治療是一個範圍(比如,你會datetime值)

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 2013-04-24 09:48:56

+0

@Luv:更新了更多示例 – gbn 2013-04-24 09:53:53

+0

+1。 **很好的邏輯** – Luv 2013-04-24 09:54:47

1

對於領先的前綴LIKE比較,gbn的答案是可以的。對於真正 LIKE的字符串搜索對等,你可以像使用如下:
(從@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,所有這將原始位視爲字符串流。它不會神奇地將其轉換爲字符串表示形式。考慮下面的例子:

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

由於字節的0x41或序號65是在標準的拉丁代碼頁「A」。