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

Có cách nào để trích xuất văn bản khớp với một biểu thức chính quy từ một cột trong MySQL không?

Điều này không thể thực hiện được với capablities mysql regex (trừ khi cài đặt một số udf có vẻ được thiết kế cho điều đó). Về mặt kỹ thuật, vì [0-9] là một tập hợp giới hạn, bạn có thể ném 10 LOCATE của LEAST (coi chừng &vô hiệu hóa 0) và sử dụng SUBSTRING . Không phải là một bức tranh đẹp:

SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,
  LEAST(
    IF(LOCATE(0,@var)=0,LENGTH(@var),LOCATE(0,@var)),
    IF(LOCATE(1,@var)=0,LENGTH(@var),LOCATE(1,@var)),
    IF(LOCATE(2,@var)=0,LENGTH(@var),LOCATE(2,@var)),
    IF(LOCATE(3,@var)=0,LENGTH(@var),LOCATE(3,@var)),
    IF(LOCATE(4,@var)=0,LENGTH(@var),LOCATE(4,@var)),
    IF(LOCATE(5,@var)=0,LENGTH(@var),LOCATE(5,@var)),
    IF(LOCATE(6,@var)=0,LENGTH(@var),LOCATE(6,@var)),
    IF(LOCATE(7,@var)=0,LENGTH(@var),LOCATE(7,@var)),
    IF(LOCATE(8,@var)=0,LENGTH(@var),LOCATE(8,@var)),
    IF(LOCATE(9,@var)=0,LENGTH(@var),LOCATE(9,@var))
   ) -1 ) as 'result';
+---------+
| result  |
+---------+
| asjdasd | 
+---------+

Nếu bạn cần nó nhìn vào udf's. Nếu không, tốt hơn hết bạn nên tìm nạp trường và thao tác với nó bên ngoài MySQL.

Chỉnh sửa:nếu số vừa với số nguyên , hackery bẩn thỉu có thể dẫn đến:

SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,LENGTH(@var)-LENGTH(CAST(REVERSE(@var) as UNSIGNED)));
+---------+
| result  |
+---------+
| asjdasd |
+---------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn hàng loạt với SQLAlchemy ORM

  2. Đặt lại mật khẩu gốc MySQL khi không xác định được mật khẩu hiện tại

  3. Đếm các chữ cái viết hoa trong chuỗi

  4. tạo một ID trong bảng mysql auto_increment (sau thực tế)

  5. Mysql MySQL hoặc PHP Tự động chuyển đổi hàng thành hai cột