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

Jak extrahovat čísla z řetězce pomocí TSQL

Vypadá to, že už máte řešení, které splňuje vaše potřeby, ale mám malý trik, který používám k extrahování čísel z řetězců, o kterých jsem si myslel, že by mohly být někomu užitečné. Využívá výhod příkazu FOR XML a vyhýbá se explicitním smyčkám. Je to dobrá funkce inline tabulky nebo jednoduchý skalár. Dělejte si s tím, co chcete :)

DECLARE @String varchar(255) = 'This1 Is2 my3 Test4 For Number5 [email protected]';


SELECT
    CAST(( 
        SELECT CASE --// skips alpha. make sure comparison is done on upper case
            WHEN ( ASCII(UPPER(SUBSTRING(@String, Number, 1))) BETWEEN 48 AND 57 )
            THEN SUBSTRING(@String, Number, 1)
            ELSE ''END
        FROM
        ( 
            SELECT TOP 255 --// east way to get a list of numbers
                                           --// change value as needed.
                ROW_NUMBER() OVER ( ORDER BY ( SELECT 1 ) ) AS Number
             FROM master.sys.all_columns a
                CROSS JOIN master.sys.all_columns b 
        ) AS n
        WHERE Number <= LEN(@String)
        --// use xml path to pivot the results to a row
        FOR XML PATH('') ) AS varchar(255)) AS Result

Výsledek ==> 1234510



  1. Zabaluje SQL Server dotazy Select...Insert do implicitní transakce?

  2. Zobrazit sloupec pouze v případě, že není null

  3. Jak mohu v této situaci dostat mimo hodnotu smyčky foreach?

  4. Jak rekurzivně odstranit položky z tabulky?