sql >> Databáze >  >> RDS >> Mysql

Odstraňte uvozovky a čárky z řetězce v MySQL

Můj odhad je, že protože data byla schopna importovat, že pole je ve skutečnosti varchar nebo nějaké znakové pole, protože import do číselného pole mohl selhat. Zde byl testovací případ, kdy jsem spustil čistě MySQL, SQL řešení.

  1. Tabulka je pouze jeden sloupec (alfa), který je varchar.

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. Přidat záznam

    mysql> insert into t values('"1,000,000"');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t;
    
    +-------------+
    | alpha       |
    +-------------+
    | "1,000,000" | 
    +-------------+
    
  3. Aktualizujte prohlášení.

    mysql> update t set alpha = replace( replace(alpha, ',', ''), '"', '' );
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from t;
    
    +---------+
    | alpha   |
    +---------+
    | 1000000 | 
    +---------+
    

Takže nakonec výrok, který jsem použil, byl:

UPDATE table
   SET field_name = replace( replace(field_name, ',', ''), '"', '' );

Podíval jsem se na Dokumentaci MySQL a nevypadalo to, že bych dokázal najít regulární výrazy a nahradit . Ačkoli byste mohli, jako Eldila , použijte regulární výraz pro hledání a poté alternativní řešení pro nahrazení.

Buďte také opatrní s s/"(\d+),(\d+)"/$1$2/ protože co když má číslo více než jen jednu čárku, například "1 000 000", budete chtít provést globální nahrazení (v perlu je to s///g ). Ale i při globálním nahrazení začíná nahrazování tam, kde jste naposledy skončili (pokud není perl jiný) a chyběla by skupina oddělená čárkou. Možným řešením by bylo nastavit první (\d+) jako nepovinné, například s/(\d+)?,(\d+)/$1$2/g a v tomto případě bych potřeboval druhé najít a nahradit, abych odstranil uvozovky.

Zde je několik příkladů rubínových regulárních výrazů působících pouze na řetězec "1 000 000", všimněte si, že uvnitř řetězce NENÍ dvojité uvozovky, jedná se pouze o řetězec samotného čísla.

>> "1,000,000".sub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"  
>> "1,000,000".gsub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"  
>> "1,000,000".gsub( /(\d+)?,(\d+)/, '\1\2' )
# => "1000000"  
>> "1,000,000".gsub( /[,"]/, '' )
# => "1000000"  
>> "1,000,000".gsub( /[^0-9]/, '' )
# => "1000000"


  1. předat proměnnou javascript do php mysql select query

  2. Rozdíl mezi sys.sql_modules, sys.system_sql_modules a sys.all_sql_modules v SQL Server

  3. Jak obnovit materializovaný pohled v orákulu

  4. 'ověření hesla selhalo pro uživatele postgres'