source

SQL 쿼리 문자열을 자리 표시자로 바꾸기

factcode 2022. 12. 25. 09:42
반응형

SQL 쿼리 문자열을 자리 표시자로 바꾸기

내 테이블에는 많은 엔트리(이미지 경로)가 있습니다.이러한 문자열은 URL이며 다음과 같습니다.

https://example.com/images/do.php?id=1234

그리고 나는 그것들을 모두 이 형식으로 바꿔야 한다.

https://example.com/images/1234.png

따라서 "ID"는 파일 이름과 동일합니다.URL만 바꾸는 것은 어렵지 않지만 URL 문자열 끝에 정적 파일 확장자를 추가해야 합니다.그래서 그런 게 필요해

UPDATE post SET message = REPLACE(message, 'https://example.com/images/do.php?id=', 'https://example.com/images/{id}.png');

저는 SQL 사용자 경험이 전혀 없기 때문에 도와주시겠습니까?

편집//

그런 엔트리가 있어요

https://example.com/images/1234
https://example.com/images/5678

정적 파일 확장자를 추가하기 위해 필요한 쿼리는 무엇입니까?이 엔트리는 다음과 같습니다.

https://example.com/images/1234.png
https://example.com/images/5678.png

ID의 길이는 4 ~6자입니다여기서 확장자만 추가할 수 없는 주된 문제는 메시지 행에 수정할 URL 이상의 텍스트가 포함되어 있기 때문입니다.이러한 행은 다음과 같습니다.

Here is your image link: [LINK]https://example.com/images/1234.png[/LINK] You can view it now.

편집2//

"post"라는 이름의 DB 테이블은 다음과 같습니다.

id   |   message
----------------
1    |   test
2    |   Here is your image link: [LINK]https://example.com/images/1234[/LINK] You can view it now.
3    |   some strings
4    |   Here is your image link: [LINK]https://example.com/images/5678[/LINK] You can view it now.
5    |   [LINK]no correct url[/LINK]
6    |   [LINK][IMG]https://example.com/images/9123[/IMG][/LINK]
7    |   [LINK]https://example.com/images/912364[/LINK]

따라서 모든 메시지 행에 URL이 포함되어 있는 것은 아니며 [LINK]태그가 붙어 있는 모든 메시지에 올바른 URL이 포함되어 있는 것은 아닙니다.또한 ID가 긴 엔트리가 있으므로 변경하지 마십시오.

질문의 원래 버전에 대한 답변입니다.

이 방법은 질문의 예에 적용됩니다.

select concat(substring_index(path, 'do.php', 1),
              substring_index(path, '=', -1),
              '.png')
from (select 'https://example.com/images/do.php?id=1234' as path) x

쉽게 바꿀 수 있습니다.update:

update post
    set message = concat(substring_index(message, 'do.php', 1),
                         substring_index(message, '=', -1),
                         '.png')
    where message like '%do.php%=%';

두 번째 문제:

UPDATE post
SET message = concat(message,'.png')

현재 엔트리를 '.png'로 확장해 주세요:-)

편집: 아, 죄송합니다!Regex를 사용해 보십시오.

UPDATE post
SET message = CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/LINK\].*'))

이 문장은 파일 확장자가 존재하지 않는다고 단언합니다.따라서 파일 확장자가 두 배가 되지 않기 때문에 where 절 없이 문을 실행할 수 있습니다.미리 확인하실 수 있도록 하기 위해 다음과 같이 하십시오.

SELECT
    message
    ,CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/LINK\].*')) as corr_message
FROM path

패턴도 확인합니다(예:Regex101.com (예시를 문자열로 사용)

Here is your image link: [LINK]https://example.com/images/1234[/LINK] You can view it now.

패턴으로서 이하를 참조해당 패턴은 다음과 같습니다.

(.*https:\/\/example\.com\/images\/[0-9]{4,6})(\[\/LINK\].*)

괄호는 그룹을 작성합니다.첫 번째 그룹은 문자열의 첫 번째 부분입니다.업데이트는 콩캣의 첫 번째 파트입니다.그 후 '.png'을 설정합니다.업데이트 문의 세 번째 부분은 regex-pattern의 두 번째 그룹으로 나타납니다.

호프, 이게 도움이 될 거야:)

EDIT2: 좋습니다.이것이 행에 맞도록 하겠습니다.

UPDATE post
SET message = CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/(IMG|LINK)\].*')) 
WHERE message LIKE '%https://example.com/images/%'

확인하기 위한 패턴:

(.*https:\/\/example\.com\/images\/[0-9]{4,6})(\[\/(IMG|LINK)\].*)

업데이트 전 데이터 확인을 위해 선택한 항목:

SELECT
    message
    ,CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/(IMG|LINK)\].*')) as corr_message
FROM path
WHERE message LIKE '%https://example.com/images/%'

이것이 고객님의 경우에 적합하기를 바랍니다.

언급URL : https://stackoverflow.com/questions/60400619/sql-query-replace-string-with-placeholder

반응형