sql >> Database teknologi >  >> RDS >> Sqlserver

Hurtigste måde at kontrollere, om et tegn er et ciffer?

Jeg ville blive meget overrasket, hvis du nogensinde ville være i stand til at opdage nogen forskel mellem WHERE col LIKE '[0-9]' og andre metoder, du finder på. Men jeg er enig med Denis, læg det væk i en funktion, så du bruger den samme kontrol konsekvent gennem hele din kode (eller i det mindste, hvis du undgår UDF'er på grund af store scanninger osv., sæt en markør i din kode, der vil gør det nemt at ændre i stor skala senere).

Når det er sagt, vil du helt sikkert se mere af et præstationshit bare ved at bruge en skalar UDF end den metode, du bruger til at parse inde i funktionen. Du burde virkelig sammenligne ydeevnen af ​​UDF'en med at gøre det inline ved hjælp af CASE . f.eks.

SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]' 
       THEN SUBSTRING(postal, 2,1) END)
FROM ...
 

Dette vil give NULL hvis tegnet ikke er numerisk.

Hvis du kun beskæftiger dig med at kontrollere lokale variabler, er det virkelig ligegyldigt, hvilken parsingmetode du bruger, og du er bedre stillet med at fokusere din optimeringsindsats andre steder.

REDIGER tilføjer forslag til demonstreret JOIN klausul. Dette vil potentielt føre til mindre konstante scanninger, men er meget mere læsbart (langt færre understrengkald osv.):

;WITH v AS ( SELECT /* other columns, */ patientPostal, ss = SUBSTRING(v.patientPostal,2,1), FROM [whatever table is aliased v in current query] ) SELECT /* column list */ FROM [whatever table is aliased z in current query] INNER JOIN v ON z.postal = CONVERT(INT, CASE WHEN v.ss = '0' THEN ss WHEN v.ss LIKE '[1-9]' THEN LEFT(v.patientPostal, 3) END);

  1. Sådan får du database-metadata

  2. Hjælp mig med denne MySql fulde ydre joinforbindelse (eller fagforening)

  3. Oracle PLSQL-ækvivalent til ASCIISTR(N'str')

  4. en effektiv måde at teste, om der findes en tabelrække