Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Der schnellste Weg, um zu überprüfen, ob ein Zeichen eine Ziffer ist?

Ich wäre sehr überrascht, wenn Sie jemals einen Unterschied zwischen WHERE col LIKE '[0-9]' feststellen könnten und alle anderen Methoden, die Ihnen einfallen. Aber ich stimme Denis zu, verstauen Sie das in einer Funktion, so dass Sie im gesamten Code konsistent dieselbe Prüfung verwenden (oder zumindest, wenn Sie UDFs wegen großer Scans usw. vermeiden, setzen Sie eine Markierung in Ihren Code, die das tut um spätere Änderungen in großem Maßstab zu erleichtern).

Das heißt, Sie werden mit Sicherheit mehr Leistungseinbußen feststellen, wenn Sie nur eine skalare UDF verwenden, als mit der Methode, die Sie zum Analysieren innerhalb der Funktion verwenden. Sie sollten wirklich die Leistung der UDF mit der Leistung von Inline mit CASE vergleichen . z. B.

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

Dies ergibt NULL wenn das Zeichen nicht numerisch ist.

Wenn Sie sich nur mit der Überprüfung lokaler Variablen befassen, ist es wirklich egal, welche Parsing-Methode Sie verwenden, und Sie sind besser dran, Ihre Optimierungsbemühungen anderswo zu konzentrieren.

BEARBEITEN Hinzufügen eines Vorschlags zum demonstrierten JOIN Klausel. Dies führt möglicherweise zu weniger konstanten Scans, ist aber viel besser lesbar (viel weniger Aufrufe von Teilzeichenfolgen usw.):

;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);