IT

SQL: LIKE 문의 쿼리 파라미터에 REGEXP_REPLACE 사용

itgroup 2023. 1. 12. 22:10
반응형

SQL: LIKE 문의 쿼리 파라미터에 REGEXP_REPLACE 사용

대소문자를 무시한 행과 해당 열에 모두 존재할 수 있는 특수문자를 찾는 쿼리가 있습니다.그것을 위해 나는 사용한다.REGEXP_REPLACE다음과 같습니다.

SELECT *
FROM Order
WHERE REGEXP_REPLACE(reference, '[^a-zA-Z0-9äöüÄÖÜ]', '') LIKE %:search%

어디에search사용할 파라미터의 이름입니다.그건 먹히지만, 아직 소독한 건 아니야search불필요한 특수 문자의 매개 변수입니다.

제가 하고 싶은 것은 다음과 같은 것입니다. 즉, 다음과 같은 것이 있습니다.REGEXP_REPLACE오른쪽에도 있습니다.

SELECT *
FROM Order
WHERE REGEXP_REPLACE(reference, '[^a-zA-Z0-9äöüÄÖÜ]', '') LIKE %REGEXP_REPLACE(:search, '[^a-zA-Z0-9äöüÄÖÜ]', '')%

그러나 이 방법은 작동하지 않고 다음 오류가 나타납니다.

42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '%REGEXP_REPLACE(

파라미터에 함수를 사용할 수 없거나LIKE스테이트먼트?회피책이 있습니까?

LIKE 연산자에서 사용할 '%'로 시작하는 문자열과 끝나는 문자열을 생성하려는 것 같습니다.이를 위해서는 MySQL의 SQL 방언에서 내장된 문자열 조작 기능을 사용하여 문자열 조작을 명시적으로 수행해야 합니다.

쿼리에 텍스트 문자열이 필요한 모든 곳에서 이러한 함수를 사용할 수 있습니다.

문자열을 생성하려면 CONCAT를 다음과 같은 식으로 사용해 보십시오.LIKE 오른쪽에서 사용할 수 있습니다.

CONCAT('%', REGEXP_REPLACE(:search, '[^a-zA-Z0-9äöüÄÖÜ]', ''), '%')

나는 당신이 당신의 질문이 빠른 것을 원하지 않길 바랍니다.느릴 거예요.모든 가치를 검토해야 합니다.Order.reference당신의 테이블에서.느리다 왜냐하면

  1. 땜에 어쩔 수 없다WHERE f(column) LIKE whatever,그리고.
  2. column LIKE '%something%'모든 가치를 검토할 필요가 있다columnBTREE 인덱스를 랜덤으로 처리하는 것이 아니라

스케일업할 데이터베이스를 구축하는 경우 쿼리를 분할할 수 있도록 데이터베이스를 설계합니다.여기 Sargability는

WHERE cleaned_up_reference 
 LIKE CONCAT(REGEXP_REPLACE(:search, '[^a-zA-Z0-9äöüÄÖÜ]', ''), '%')

주역 없이%검색 중인 열에 대한 함수를 평가하지 않고 오른쪽에 표시됩니다.

다음과 같이 시험해 보십시오.

SELECT * FROM Order a
WHERE REGEXP_REPLACE(a.reference, '[^a-zA-Z0-9äöüÄÖÜ]', '') LIKE '%:search%'

언급URL : https://stackoverflow.com/questions/70363383/sql-use-regexp-replace-on-query-parameter-inside-of-like-statement

반응형