sql >> Databáze >  >> RDS >> Sqlserver

Nejrychlejší způsob, jak zkontrolovat, zda je znak číslice?

Byl bych velmi překvapen, kdybyste někdy byli schopni zjistit jakýkoli rozdíl mezi WHERE col LIKE '[0-9]' a jakékoli další metody, které vymyslíte. Ale souhlasím s Denisem, dejte to pryč do funkce, abyste používali stejnou kontrolu konzistentně v celém svém kódu (nebo alespoň, pokud se vyhýbáte UDF kvůli velkým skenům atd., vložte do kódu značku, která usnadnit pozdější změnu v širokém měřítku).

To znamená, že s největší pravděpodobností uvidíte větší zásah do výkonu pouze pomocí skalárního UDF než pomocí metody, kterou používáte k analýze uvnitř funkce. Opravdu byste měli porovnat výkon UDF s tím, že to děláte inline pomocí CASE . např.

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

Výsledkem bude NULL pokud znak není číselný.

Pokud se zabýváte pouze kontrolou místních proměnných, opravdu nezáleží na tom, jakou metodu analýzy použijete, a je lepší zaměřit své optimalizační úsilí jinam.

UPRAVIT přidání návrhu k demonstrovanému JOIN doložka. To potenciálně povede k méně konstantnímu skenování, ale je mnohem čitelnější (mnohem méně volání podřetězců atd.):

;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. Scénáře zálohování a obnovy MySQL Cloud pomocí Microsoft Azure

  2. Vygenerujte Javascript Array z Mysql select

  3. Jak vypočítat rozdíl mezi dvěma časovými razítky v Oracle

  4. Django nemůže zrušit databázi:psycopg2.OperationalError:nelze zrušit aktuálně otevřenou databázi