Forudsat at du har dine felter i dette format:
00Data0007
000000Data0011
0000Data0015
, kan du gøre følgende:
-
Opret en beregnet kolonne:
ndata AS RIGHT(REVERSE(data), LEN(data) - 4)
Dette vil forvandle dine kolonner til følgende:
ataD00 ataD000000 ataD0000
-
Opret et indeks på den kolonne
-
Udsted denne forespørgsel for at søge efter strengen
Data
:SELECT * FROM mytable WHERE ndata LIKE N'ataD%' AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
Den første betingelse vil bruge et indeks til grovfiltrering.
Den anden vil sikre, at alle indledende tegn (der blev de efterfølgende tegn i den beregnede kolonne) ikke er andet end nuller.
Se dette indlæg i min blog for detaljer om ydeevne:
Opdater
Hvis du bare vil have et indeks på SUBSTRING
uden at ændre dit skema, er det en mulighed at oprette en visning.
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'