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

Vzor regulárního výrazu ve funkci Nahradit SQL?

K nalezení prvního indexu výskytu vzoru (řetězce) můžete použít PATINDEX. Poté pomocí STUFF nacpete další řetězec do shodného vzoru (řetězce).

Projděte každý řádek. Nahraďte každý nelegální znak tím, co chcete. Ve vašem případě nahraďte nenumerické místo prázdným. Vnitřní smyčka je, pokud máte více než jeden nepovolený znak v aktuální buňce smyčky.

DECLARE @counter int

SET @counter = 0

WHILE(@counter < (SELECT MAX(ID_COLUMN) FROM Table))
BEGIN  

    WHILE 1 = 1
    BEGIN
        DECLARE @RetVal varchar(50)

        SET @RetVal =  (SELECT Column = STUFF(Column, PATINDEX('%[^0-9.]%', Column),1, '')
        FROM Table
        WHERE ID_COLUMN = @counter)

        IF(@RetVal IS NOT NULL)       
          UPDATE Table SET
          Column = @RetVal
          WHERE ID_COLUMN = @counter
        ELSE
            break
    END

    SET @counter = @counter + 1
END

Pozor:Je to pomalé! Mít sloupec varchar může mít vliv. Takže použití LTRIM RTRIM může trochu pomoci. Bez ohledu na to je to pomalé.

Kredit jde na tuto odpověď StackOverFlow.

EDITCredit jde také na @srutzky

Upravit (od @Tmdean) Namísto provádění jednoho řádku po druhém lze tuto odpověď přizpůsobit řešení více založenému na sadě. Stále iteruje maximální počet nenumerických znaků v jednom řádku, takže to není ideální, ale myslím, že by to mělo být přijatelné ve většině situací.

WHILE 1 = 1 BEGIN
    WITH q AS
        (SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n
        FROM Table)
    UPDATE Table
    SET Column = STUFF(Column, q.n, 1, '')
    FROM q
    WHERE Table.ID_Column = q.ID_Column AND q.n != 0;

    IF @@ROWCOUNT = 0 BREAK;
END;

Efektivitu můžete také značně zlepšit, pokud v tabulce budete udržovat sloupec bitů, který ukazuje, zda bylo pole již vyčištěno. (NULL v mém příkladu představuje "Neznámý" a měl by být výchozím sloupcem.)

DECLARE @done bit = 0;
WHILE @done = 0 BEGIN
    WITH q AS
        (SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n
        FROM Table
        WHERE COALESCE(Scrubbed_Column, 0) = 0)
    UPDATE Table
    SET Column = STUFF(Column, q.n, 1, ''),
        Scrubbed_Column = 0
    FROM q
    WHERE Table.ID_Column = q.ID_Column AND q.n != 0;

    IF @@ROWCOUNT = 0 SET @done = 1;

    -- if Scrubbed_Column is still NULL, then the PATINDEX
    -- must have given 0
    UPDATE table
    SET Scrubbed_Column = CASE
        WHEN Scrubbed_Column IS NULL THEN 1
        ELSE NULLIF(Scrubbed_Column, 0)
    END;
END;

Pokud nechcete měnit své schéma, je snadné jej přizpůsobit tak, aby se mezivýsledky ukládaly do proměnné s hodnotou tabulky, která se na konci aplikuje na skutečnou tabulku.



  1. Jak přidat měsíc k datu v SQLite

  2. Přílohy v Oracle Applications R12

  3. Uzavřete řetězce do jednoduchých uvozovek ve výsledcích dotazu SQLite

  4. chybí položka klauzule FROM pro tabulku Grupo cakephp