2013-04-24 16 views
5

Sto usando SQL Server 2008. Nel mio tavolo ho una colonna chiamata TestData di tipo binary.interrogare la colonna binaria usando come nel server sql

dati campione nella colonna TestData sono

1. 0x0001DC780C0030373156635D0C00B8840301009A0600AC 
2. 0x0301DC780C0030373156385D0C006499C401009A0600AC 

Ha scritto di seguito due query per ottenere le righe in cui TestData inizia con "0x0001". Ma nessuno di loro sta funzionando.

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 

Si prega di correggere la query per ottenere i risultati attesi

+0

Le tue due domande sono esattamente le stesse? Inoltre ho aggiunto una risposta con più spiegazione e codice per fare un carattere jolly a due lati LIKE. – RichardTheKiwi

risposta

9

non si convertono, ma trattare è come un intervallo (come si farebbe datetime valori)

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; 

Questo ha il bonus di essere in grado di utilizzare un indice su TestData

Modifica, è sufficiente specificare tutte le cifre necessarie

+0

Cosa devo fare quando voglio cercare ** ''0x0301%'' ** – Luv

+0

@Luv: aggiornato con altri esempi – gbn

+0

+1. ** Bella logica. ** – Luv

1

Per un prefisso simile come il confronto, la risposta di gbn farà. Per un vero e proprio COME equivalenza delle ricerche di stringhe, è possibile utilizzare LIKE come segue:
(schema prestito e di campioni di dati da @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))+'%'; 

Quando lanci un valore binario a VARCHAR, tutto ciò che tratta i bit grezzi come un flusso di stringhe. Non lo converte magicamente nella rappresentazione della stringa. Si consideri il seguente esempio:

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

Poiché il byte 0x41 o ordinali 65 è 'A' nella tabella codici Latin standard.

Problemi correlati