Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Модел на регулярни изрази във функцията за замяна на SQL?

Можете да използвате PATINDEX, за да намерите първия индекс на появата на шаблона (низ). След това използвайте STUFF, за да напълните друг низ в съответстващия модел(низ).

Прокарайте през всеки ред. Заменете всеки нелегален символ с това, което искате. Във вашия случай заменете нечисловото с празно. Вътрешният цикъл е, ако имате повече от един непозволен знак в текущата клетка, този на цикъла.

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

Внимание:Това обаче е бавно! Наличието на колона varchar може да повлияе. Така че използването на LTRIM RTRIM може да помогне малко. Независимо от това е бавно.

Заслугата е на този отговор на StackOverFlow.

EDITCredit също отива на @srutzky

Редактиране (от @Tmdean) Вместо да правите един ред наведнъж, този отговор може да бъде адаптиран към по-базирано на набор решение. Той все още повтаря максималния брой нечислови знаци в един ред, така че не е идеално, но мисля, че трябва да е приемливо в повечето ситуации.

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;

Можете също така да подобрите ефективността доста, ако поддържате битова колона в таблицата, която показва дали полето все още е пречистено. (NULL представлява „Неизвестно“ в моя пример и трябва да бъде колоната по подразбиране.)

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;

Ако не искате да променяте схемата си, това е лесно да се адаптира за съхраняване на междинни резултати в таблично стойностна променлива, която се прилага към действителната таблица в края.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да промените стойностите за редактиране на най-горния X и избор на най-горните X редове в SQL Server Management Studio (SSMS) - SQL Server / TSQL урок, част 20

  2. Как да изтриете файлове в SQL Server 2019

  3. MONTH() Примери в SQL Server (T-SQL)

  4. Създайте временна таблица на базата на друга таблица в SQL Server

  5. Как да създавате работни места в SQL Server Express издание