2013-04-24 10 views
5

Ich benutze SQL Server 2008. In meiner Tabelle habe ich eine Spalte namens TestData des Typs binary.Abfrage binäre Spalte mit Like in SQL-Server

Beispieldaten in Testdata Spalte sind

1. 0x0001DC780C0030373156635D0C00B8840301009A0600AC 
2. 0x0301DC780C0030373156385D0C006499C401009A0600AC 

unter zwei Abfragen Schrieb die Zeilen, in denen Testdata beginnt mit „0x0001“ zu bekommen. Aber keiner von ihnen arbeitet.

SELECT * 
FROM T_TRANSACTION 
WHERE CAST(Indicium AS nvarchar(MAX)) LIKE '0x0001%' 

----No results found 

SELECT * 
FROM T_TRANSACTION 
WHERE CAST(Indicium AS nvarchar(MAX)) LIKE '0x0001%' 

----Returns all the rows 

Bitte korrigieren Sie die Abfrage die erwarteten Ergebnisse zu erhalten

+0

Ihre zwei Abfragen sind genau die gleichen? Außerdem fügte ich eine Antwort mit mehr Erklärung und Code hinzu, um eine zweiseitige Wildcard LIKE zu machen. – RichardTheKiwi

Antwort

9

nicht konvertieren, aber behandeln ist als Bereich (wie Sie Werte datetime würde)

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; 

Dieser den Bonus hat Möglichkeit, einen Index auf TestData

Edit zu verwenden, geben Sie einfach so viele Ziffern ein, wie Sie benötigen

+0

Was muss ich tun, wenn ich suchen möchte? '' 0x0301% ''** – Luv

+0

@Luv: aktualisiert mit weiteren Beispielen – gbn

+0

+1. ** Nette Logik. ** – Luv

1

Für einen führenden Präfix LIKE-Vergleich reicht die Antwort von gbn aus. Für eine echte LIKE Gleichwertigkeit der Zeichenfolge sucht, können Sie LIKE wie folgt:
(Borgen Schema und Beispieldaten aus @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))+'%'; 

Wenn Sie einen Binärwert VARCHAR, alle es do behandelt die rohen Bits als String-Stream. Es wandelt es nicht magisch in die String-Darstellung um. Betrachten Sie das folgende Beispiel:

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

Da das Byte 0x41 oder Ordnungs 65 ist 'A' in der Standard-Latin Zeichensatz.