MySQL에서 REGEXP를 사용하여 SUBSTRING을 사용하는 방법


14

다음과 같은 상황이 있습니다. MySQL을 사용하여 설명에서 정규 표현식을 부분 문자열로 묶어야합니다. 기술:

Lorem D9801 ipsum dolor 앉은 자세

여기서 D9801은 REGEXP입니다. 강력한 텍스트 설명 마다 내용이 다르지만 정규 표현식은 다음과 같아야합니다. REGEXP 'D [[: digit :]] {4}'

REGEXP의 시작 부분에는 항상 "D"가 있고 끝에는 "xxxx"-4 자리가 있습니다 : Dxxxx

REGEXP는 true / false 값만 반환하지만 어떻게 'D9801'값만 반환하도록 쿼리를 만들 수 있습니까?

나는 이와 같은 것을 시도했다 :

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

나는 그것이 틀렸다는 것을 알고 있으므로 다음과 같이 시도하십시오.

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;

그러나 정규 표현식의 위치를 ​​찾는 방법은 무엇입니까?

UDF에 대해 들었지만 사용할 수 없으며 OVH 호스팅을 사용합니다.


이것은 기본적으로의 DUP입니다 : stackoverflow.com/questions/4021507/...
나단 Feger

다른 매칭 방법은이 상황에서 어떤 나던 작업에 일치하는 전체 문자열 알고에 의존 일치하는 정규 표현식 기능에서 패턴 검색 할 수없는 기능이 내장되어있다 UDF를 사용하지 않고
페이로드

답변:


3

문자열에서 정보를 가져 오려면 LOCATEand SUBSTRING구문 을 사용해야 합니다. 필요한 기본 찾기 구문은 여기 에 설명되어 있습니다 .

위치 (검색 str, str, [position])

search str = 검색 할 문자열입니다.

str = 검색 할 문자열.

position (선택 사항) = 두 번째 인수 내에서 검색이 시작되는 위치입니다.

필요한 부분 문자열 기능이 여기 에 설명되어 있지만

SUBSTRING (str, pos, len)

str = 문자열.

pos = 시작 위치.

len = 문자 길이.

이것을 보는 가장 쉬운 방법은 부분 문자열을 다음과 같이 생각하는 것입니다. SUBSTRING (str FROM pos FOR len)

두 번째 단어를 얻는 데 사용한 구문은 아래에 있습니다. 추출하려는 두 번째 단어 주위의 공간을 끊임없이 활용했습니다.

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

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

1

불행히도 MySQL의 정규 표현식 함수는 표현식의 존재 여부에 따라 true, false 또는 null을 반환합니다.

원하는 동작에 영향을주는 요령은 관심있는 문자로 시작하고 올바른 길이를 가지며 숫자가 오는 부분 문자열을 결정하는 것입니다. 일련의 substring_index 함수는 문자열을 추출하는 데 사용됩니다 ...

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.