sql >> Database >  >> RDS >> Sqlserver

SQL Server - index op een berekende kolom?

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'


  1. Door de lente beheerde boneninjectie in de klas met RowMapper

  2. Oracle:ORA-12154:TNS-probleem:Excel 64-bit/Windows 10 64-bit

  3. Hoe te bepalen of NULL zich in een array in Postgres bevindt?

  4. Grails 3 - Gradle afhankelijkheden Mysql Connector