Ervan uitgaande dat u uw velden in dit formaat heeft:
00Data0007
000000Data0011
0000Data0015
, kunt u het volgende doen:
-
Maak een berekende kolom:
ndata AS RIGHT(REVERSE(data), LEN(data) - 4)
Dit zal uw kolommen in het volgende veranderen:
ataD00 ataD000000 ataD0000
-
Maak een index op die kolom
-
Voer deze zoekopdracht uit om te zoeken naar de tekenreeks
Data
:SELECT * FROM mytable WHERE ndata LIKE N'ataD%' AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
De eerste voorwaarde gebruikt een index voor grove filtering.
De tweede zorgt ervoor dat alle hoofdtekens (die de volgende tekens in de berekende kolom werden) niets anders zijn dan nullen.
Zie dit bericht in mijn blog voor details over de prestaties:
Bijwerken
Als je alleen een index wilt op SUBSTRING
zonder uw schema te wijzigen, is het maken van een weergave een optie.
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'