sql >> Database >  >> RDS >> Sqlserver

Snelste manier om te controleren of een teken een cijfer is?

Het zou me verbazen als je ooit enig verschil zou kunnen ontdekken tussen WHERE col LIKE '[0-9]' en alle andere methoden die u bedenkt. Maar ik ben het met Denis eens, stop dat weg in een functie zodat je dezelfde controle consequent in al je code gebruikt (of tenminste, als je UDF's vermijdt vanwege grote scans enz., plaats dan een markering in je code die zal maken het later gemakkelijk om op grote schaal te veranderen).

Dat gezegd hebbende, je zult zeker meer een prestatiehit zien door alleen een scalaire UDF te gebruiken dan welke methode je gebruikt om in de functie te parseren. Je zou echt de prestaties van de UDF moeten vergelijken met dat inline doen met CASE . bijv.

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

Dit levert NULL . op als het teken niet numeriek is.

Als u zich alleen bezighoudt met het controleren van lokale variabelen, maakt het echt niet uit welke ontledingsmethode u gebruikt, en kunt u uw optimalisatie-inspanningen beter ergens anders concentreren.

BEWERKEN suggestie toevoegen aan gedemonstreerde JOIN clausule. Dit zal mogelijk leiden tot minder constante scans, maar is veel leesbaarder (veel minder substring-aanroepen enz.):

;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. Kan geen verbinding maken met externe mysql-server met behulp van unixodbc, libmyodbc

  2. Heeft een insert-trigger een commit-instructie nodig?

  3. PostgreSQL - hoe de datum in een andere tijdzone te renderen?

  4. Backquote/backticks gebruiken voor mysql-query's