Cách sử dụng SUBSTRING bằng REGEXP trong MySQL


14

Tôi có tình huống sau đây. Tôi phải xâu chuỗi biểu thức chính quy từ mô tả bằng MySQL. Sự miêu tả:

Lorem D9801 ipsum dolor ngồi amet

Trong đó D9801 là REGEXP. Mỗi mô tả văn bản mạnh có nội dung khác nhau, nhưng biểu thức chính của tôi sẽ giống như: REGEXP 'D [[: chữ số:]] {4}'

REGEXP luôn có "D" ở đầu và "xxxx" - 4 chữ số ở cuối: Dxxxx

Tôi biết REGEXP chỉ trả về giá trị đúng / sai, nhưng làm cách nào tôi có thể thực hiện truy vấn để chỉ trả về giá trị 'D9801'?

Tôi đã thử một cái gì đó như thế này:

SELECT SUBSTRING (description, LOCATE(REGEXP 'D[[:digit:]]{4}', description), 5)
FROM (
   SELECT "Lorem D9801 ipsum dolor sit amet" AS description
) temp

Tôi biết đó là sai, vì vậy tôi thử với điều này:

SELECT 
    id, 
    SUM(description REGEXP 'D[[:digit:]]{4}') AS matches, 
    CASE
        WHEN (SUM(description REGEXP 'D[[:digit:]]{4}') > 0) THEN 
            SUBSTRING(description, LOCATE( /*POSITION_OF_REGEXP_IN_DESC*/ , description), 5)
        ELSE 'Brak schematu'
    END AS show_substr FROM ps_description GROUP BY id;

Nhưng làm thế nào để tìm vị trí của regrec?

Tôi đã nghe nói về UDF nhưng tôi không thể sử dụng nó, tôi sử dụng lưu trữ OVH.


Về cơ bản, đây là bản sao của: stackoverflow.com/questions
4021507 / Từ

Không sử dụng UDF, không có chức năng tích hợp nào để truy xuất mẫu phù hợp từ hàm REGEXP và các phương thức khớp khác dựa vào việc biết chuỗi đầy đủ mà bạn khớp với nó không hoạt động trong tình huống này
Tải trọng

Câu trả lời:


3

Điều này sẽ cần phải sử dụng LOCATESUBSTRINGcú pháp để lấy thông tin ra khỏi chuỗi. Cú pháp định vị cơ bản bạn sẽ cần được giải thích ở đây .

VỊ TRÍ (tìm kiếm str, str, [vị trí])

tìm kiếm str = Một chuỗi sẽ được tìm kiếm.

str = Một chuỗi sẽ được tìm kiếm.

vị trí (tùy chọn) = Vị trí từ đó (trong đối số thứ hai), việc tìm kiếm sẽ bắt đầu.

Trong khi chức năng chuỗi con bạn cần được giải thích ở đây

ĐĂNG KÝ (str, pos, len)

str = Một chuỗi.

pos = Vị trí bắt đầu.

len = Độ dài tính bằng ký tự.

Cách dễ dàng hơn để xem điều này là nghĩ về chuỗi con như SUBSTRING sau (str TỪ pos FOR len)

Sytax tôi đã sử dụng để có được từ thứ hai ở bên dưới, tôi đã tận dụng các khoảng trắng liên tục xung quanh từ thứ hai mà bạn đang cố gắng trích xuất.

declare @String varchar(50) ='Lorem D9801 ipsum dolor sit amet'

SUBSTRING
(
@String,
LOCATE(' ', @String),
LOCATE(' ', @String, (LOCATE(' ', @String) + 1)) - LOCATE(' ', @String)
)

1

Thật không may, hàm biểu thức chính quy của MySQL trả về true, false hoặc null tùy thuộc vào biểu thức có tồn tại hay không.

Thủ thuật trong việc thực hiện hành vi mong muốn là xác định chuỗi con nào bắt đầu bằng ký tự bạn quan tâm, có độ dài chính xác và được theo sau bởi một số. Một loạt các hàm sub chuỗi_index được sử dụng để trích xuất chuỗi ...

set @string:='Lorem D9801 ipsum dolor sit amet';
select
case when @string like '% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',1),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',2),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',3),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',4),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',5),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
end as test_case;
+-----------+
| test_case |
+-----------+
| D9801     |
+-----------+
1 row in set (0.00 sec)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.