Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để trích xuất hai chữ số liên tiếp từ một trường văn bản trong MySQL?

Nếu bạn muốn có thêm sức mạnh của biểu thức chính quy trong cơ sở dữ liệu của mình, bạn có thể xem xét sử dụng LIB_MYSQLUDF_PREG . Đây là một thư viện mã nguồn mở của các hàm người dùng MySQL nhập thư viện PCRE. LIB_MYSQLUDF_PREG chỉ được phân phối ở dạng mã nguồn. Để sử dụng nó, bạn cần có khả năng biên dịch và cài đặt nó vào máy chủ MySQL của mình. Cài đặt thư viện này không thay đổi hỗ trợ regex tích hợp của MySQL theo bất kỳ cách nào. Nó chỉ cung cấp các chức năng bổ sung sau:

PREG_CAPTURE trích xuất một trận đấu regex từ một chuỗi. PREG_POSITION trả về vị trí mà tại đó biểu thức chính quy khớp với một chuỗi. PREG_REPLACE thực hiện tìm kiếm và thay thế trên một chuỗi. PREG_RLIKE kiểm tra xem một regex có khớp với một chuỗi hay không.

Tất cả các hàm này nhận một biểu thức chính quy làm tham số đầu tiên của chúng. Biểu thức chính quy này phải được định dạng giống như một toán tử biểu thức chính quy Perl. Ví dụ. để kiểm tra xem regex có khớp với chủ đề không, bạn sẽ sử dụng mã MySQL PREG_RLIKE ('/ regex / i', subject). Điều này tương tự với các hàm preg của PHP, cũng yêu cầu thêm // dấu phân cách cho các biểu thức chính quy bên trong chuỗi PHP.

Nếu bạn muốn thứ gì đó đơn giản hơn, bạn có thể thay đổi chức năng này để phù hợp hơn với nhu cầu của mình.

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. Tôi có một mảng các số nguyên, làm cách nào để sử dụng từng số nguyên trong truy vấn mysql (trong php)?

  2. SQL - NẾU TỒN TẠI CẬP NHẬT ELSE INSERT INTO

  3. Làm thế nào để chuyển đổi epoch sang mySQL timestamp trong JAVA

  4. Kết nối với máy chủ MySQL từ xa bằng PHP

  5. Vấn đề về ĐẶT HÀNG MYSQL THEO TRƯỜNG HỢP