Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Usuń cytaty i przecinki z ciągu znaków w MySQL

Domyślam się, że ponieważ dane były w stanie zaimportować, że pole jest w rzeczywistości polem varchar lub jakimś polem znakowym, ponieważ importowanie do pola liczbowego mogło się nie powieść. Oto przypadek testowy, w którym uruchomiłem wyłącznie rozwiązanie MySQL i SQL.

  1. Tabela to tylko pojedyncza kolumna (alfa), która jest warcharem.

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. Dodaj rekord

    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. Zaktualizuj oświadczenie.

    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 | 
    +---------+
    

Więc w końcu użyłem stwierdzenia:

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

Zajrzałem do Dokumentacji MySQL i nie wyglądało na to, że mogę wykonać wyrażenia regularne znajdź i zamień . Chociaż możesz, jak Eldila , użyj wyrażenia regularnego do znalezienia, a następnie alternatywnego rozwiązania do zamiany.

Uważaj także na s/"(\d+),(\d+)"/$1$2/ bo co, jeśli liczba ma więcej niż tylko jeden przecinek, na przykład "1.000.000" będziesz chciał dokonać globalnego zastąpienia (w perlu to jest s///g ). Ale nawet w przypadku globalnego zastąpienia zastąpienie zaczyna się w miejscu, w którym ostatnio przerwałeś (chyba że perl jest inny) i pominie każdą inną grupę oddzieloną przecinkami. Możliwym rozwiązaniem byłoby uczynienie pierwszego (\d+) opcjonalnym, tak jak s/(\d+)?,(\d+)/$1$2/g w tym przypadku potrzebowałbym drugiego znaleźć i zastąpić, aby usunąć cudzysłowy.

Oto kilka przykładów rubinowych wyrażeń regularnych działających tylko na łańcuchu "1.000.000", zauważ, że wewnątrz łańcucha NIE ma podwójnego cudzysłowu, jest to tylko łańcuch zawierający samą liczbę.

>> "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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Wybierz grupę rekordów na podstawie ostatniego znacznika czasu

  2. Jak wykonać kopię zapasową baz danych MySQL z wiersza poleceń w systemie Linux

  3. SQL SELECT ORDER BY wiele kolumn w zależności od wartości innej kolumny

  4. Używanie Gita do śledzenia schematu mysql - kilka pytań

  5. Unikalny indeks mysql używany jako metoda obsługi wyjątków w java