Supponendo che tu abbia i tuoi campi in questo formato:
00Data0007
000000Data0011
0000Data0015
, puoi fare quanto segue:
-
Crea una colonna calcolata:
ndata AS RIGHT(REVERSE(data), LEN(data) - 4)
Questo trasformerà le tue colonne nelle seguenti:
ataD00 ataD000000 ataD0000
-
Crea un indice su quella colonna
-
Invia questa query per cercare la stringa
Data
:SELECT * FROM mytable WHERE ndata LIKE N'ataD%' AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
La prima condizione utilizzerà un indice per il filtraggio grossolano.
Il secondo assicurerà che tutti i caratteri iniziali (che sono diventati i caratteri finali nella colonna calcolata) non siano altro che zeri.
Vedi questa voce nel mio blog per i dettagli sulle prestazioni:
Aggiorna
Se vuoi solo un indice su SUBSTRING
senza modificare lo schema, la creazione di una vista è un'opzione.
CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM mytable
CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)
SELECT id, data
FROM v_substring75
WHERE substring75 = '12345'