Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mengekstrak dua digit berturut-turut dari bidang teks di MySQL?

Jika Anda menginginkan lebih banyak kekuatan ekspresi reguler dalam database Anda, Anda dapat mempertimbangkan untuk menggunakan LIB_MYSQLUDF_PREG . Ini adalah perpustakaan sumber terbuka dari fungsi pengguna MySQL yang mengimpor perpustakaan PCRE. LIB_MYSQLUDF_PREG dikirimkan dalam bentuk kode sumber saja. Untuk menggunakannya, Anda harus dapat mengompilasinya dan menginstalnya ke server MySQL Anda. Menginstal perpustakaan ini tidak mengubah dukungan regex bawaan MySQL dengan cara apa pun. Itu hanya membuat fungsi tambahan berikut tersedia:

PREG_CAPTURE mengekstrak kecocokan regex dari string. PREG_POSITION mengembalikan posisi di mana ekspresi reguler cocok dengan string. PREG_REPLACE melakukan pencarian dan penggantian pada sebuah string. PREG_RLIKE menguji apakah ekspresi reguler cocok dengan string.

Semua fungsi ini mengambil ekspresi reguler sebagai parameter pertama mereka. Ekspresi reguler ini harus diformat seperti operator ekspresi reguler Perl. Misalnya. untuk menguji apakah regex cocok dengan kasus subjek secara tidak sensitif, Anda akan menggunakan kode MySQL PREG_RLIKE('/regex/i', subjek). Ini mirip dengan fungsi preg PHP, yang juga memerlukan // pembatas tambahan untuk ekspresi reguler di dalam string PHP.

Jika Anda menginginkan sesuatu yang lebih sederhana, Anda dapat mengubah fungsi ini agar lebih sesuai dengan kebutuhan Anda.

CREATE FUNCTION REGEXP_EXTRACT(string TEXT, exp TEXT)
-- Extract the first longest string that matches the regular expression
-- If the string is 'ABCD', check all strings and see what matches: 'ABCD', 'ABC', 'AB', 'A', 'BCD', 'BC', 'B', 'CD', 'C', 'D'
-- It's not smart enough to handle things like (A)|(BCD) correctly in that it will return the whole string, not just the matching token.

RETURNS TEXT
DETERMINISTIC
BEGIN
  DECLARE s INT DEFAULT 1;
  DECLARE e INT;
  DECLARE adjustStart TINYINT DEFAULT 1;
  DECLARE adjustEnd TINYINT DEFAULT 1;

  -- Because REGEXP matches anywhere in the string, and we only want the part that matches, adjust the expression to add '^' and '$'
  -- Of course, if those are already there, don't add them, but change the method of extraction accordingly.

  IF LEFT(exp, 1) = '^' THEN 
    SET adjustStart = 0;
  ELSE
    SET exp = CONCAT('^', exp);
  END IF;

  IF RIGHT(exp, 1) = '$' THEN
    SET adjustEnd = 0;
  ELSE
    SET exp = CONCAT(exp, '$');
  END IF;

  -- Loop through the string, moving the end pointer back towards the start pointer, then advance the start pointer and repeat
  -- Bail out of the loops early if the original expression started with '^' or ended with '$', since that means the pointers can't move
  WHILE (s <= LENGTH(string)) DO
    SET e = LENGTH(string);
    WHILE (e >= s) DO
      IF SUBSTRING(string, s, e) REGEXP exp THEN
        RETURN SUBSTRING(string, s, e);
      END IF;
      IF adjustEnd THEN
        SET e = e - 1;
      ELSE
        SET e = s - 1; -- ugh, such a hack to end it early
      END IF;
    END WHILE;
    IF adjustStart THEN
      SET s = s + 1;
    ELSE
      SET s = LENGTH(string) + 1; -- ugh, such a hack to end it early
    END IF;
  END WHILE;

  RETURN NULL;

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. MySQL dan NoSQL:Bantu saya memilih yang tepat

  2. kode php untuk menguji pdo tersedia?

  3. Bagaimana cara mengambil data JSON dari MySQL?

  4. Hapus atau Pangkas Beberapa Karakter Pertama atau Terakhir di Database MySQL dengan SQL

  5. Bagaimana cara melakukan penyisipan massal di MySQL?