programing

MySQL LIKE IN()?

javaba 2022. 10. 27. 23:39
반응형

MySQL LIKE IN()?

현재 문의는 다음과 같습니다.

SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'

주위를 둘러봐도 LIKE IN()과 비슷한 것을 찾을 수 없습니다.이렇게 동작하는 것을 상정하고 있습니다.

SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')

좋은 생각 있어요?내가 그 문제를 잘못된 방식으로 생각하고 있는 걸까? 내가 본 적이 없는 애매한 명령이다.

MySQL 5.0.77-community-log

REGEXP가 더 효율적일 수 있지만, 이를 확실하게 하기 위해서는 벤치마크를 해야 합니다.

SELECT * from fiberbox where field REGEXP '1740|1938|1940'; 

Paul Dixon의 답변은 나에게 매우 효과적이었다.여기에 덧붙여, REGEXP 의 사용에 관심이 있는 유저를 위해서, 다음의 몇개의 점에 주의해 주세요.

와일드카드를 사용하여 여러 LIKE 필터를 실행하려면:

 SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
                           OR field LIKE '%1938 %'
                           OR field LIKE '%1940 %';  

대체 REGEXP 사용:

 SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';

REGEXP 따옴표 내 및 | (OR) 연산자 사이의 값은 와일드카드로 취급됩니다.통상, REGEXP 에서는, %1740 % 로서 기능하기 위해서, (.*)1740 (.*)등의 와일드 카드 표현이 필요합니다.

와일드카드 배치를 보다 상세하게 제어할 필요가 있는 경우는, 다음의 몇개의 배리언트를 사용합니다.

제어된 와일드카드 배치를 사용하여 LIKE를 실행하려면:

SELECT * FROM fiberbox WHERE field LIKE '1740 %'
                          OR field LIKE '%1938 '
                          OR field LIKE '%1940 % test';  

용도:

SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
  • 값 앞에 ^을 배치하면 회선의 시작을 나타냅니다.

  • 값 뒤에 $를 입력하면 줄의 끝을 나타냅니다.

  • (.*)를 배치하면 % 와일드카드와 같이 동작합니다.

  • .는 줄 바꿈을 제외한 단일 문자를 나타냅니다.안쪽()에 *(.*)를 배치하면 줄 끝까지 임의의 수의 문자를 나타내는 반복 패턴이 추가됩니다.

특정 일치를 좁히는 보다 효율적인 방법이 있지만, 그러기 위해서는 정규 표현에 대한 더 많은 검토가 필요합니다.메모: MySQL 문에서 일부 regex 패턴이 동작하는 것은 아닙니다.당신의 패턴을 테스트하고 무엇이 효과가 있는지 봐야 할 것이다.

마지막으로 LIKE 필터와 NOT LIKE 필터를 여러 개 사용하려면 다음 절차를 따릅니다.

SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
                          OR field LIKE '%1938 %'
                          OR field NOT LIKE '%1940 %'
                          OR field NOT LIKE 'test %'
                          OR field = '9999';

대체 REGEXP 사용:

SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
                          OR field NOT REGEXP '1940 |^test ';

또는 혼합 대안:

SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
                          OR field NOT REGEXP '1940 |^test '
                          OR field NOT LIKE 'test %'
                          OR field = '9999';

NOT 세트를 다른 WHERE 필터로 분리한 것에 주의해 주세요.부정 패턴, 전방 주시 패턴 등을 사용해 보았습니다.그러나 이러한 표현은 원하는 결과를 도출하지 못한 것으로 보인다.위의 첫 번째 예에서는 ^9999$를 사용하여 정확한 일치를 나타냅니다.이것에 의해, 같은 식에 와일드 카드 일치와 함께 특정의 일치를 추가할 수 있습니다.그러나 나열된 두 번째 예에서 볼 수 있듯이 이러한 유형의 문을 혼합할 수도 있습니다.

퍼포먼스에 대해서는 기존 테이블에 대해 몇 가지 마이너 테스트를 실시해 본 결과, 차이점이 없었습니다.그러나 데이터베이스, 필드, 레코드 수, 필터가 더 복잡할 경우 성능이 문제가 될 수 있습니다.

항상 그렇듯이 위의 논리를 이치에 맞는 대로 사용하십시오.

정규 표현에 대해 자세히 알고 싶다면 www.regular-expressions.info을 참고하십시오.

값 목록을 사용한 Regexp 방법

SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");

인라인 뷰 또는 임시 테이블을 생성하여 값을 입력하고 다음을 발행할 수 있습니다.

SELECT  *
FROM    fiberbox f
JOIN    (
        SELECT '%1740%' AS cond
        UNION ALL
        SELECT '%1938%' AS cond
        UNION ALL
        SELECT '%1940%' AS cond
        ) с
ON      f.fiberBox LIKE cond

이렇게 ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, fiberbox은 의 그 that'1740, 1938'따라서 이 쿼리는 사용자에게 더 적합합니다.

SELECT  *
FROM    fiberbox f
WHERE   EXISTS
        (
        SELECT  1
        FROM    (
                SELECT '%1740%' AS cond
                UNION ALL
                SELECT '%1938%' AS cond
                UNION ALL
                SELECT '%1940%' AS cond
                ) с
        WHERE   f.fiberbox LIKE cond
        )

★★★★★★★와 같은 . 하다LIKE INmysql.mysql.mysql.mydl.mydl

조인 없이 LIKE 연산자를 사용하려면 다음과 같이 해야 합니다.

(field LIKE value OR field LIKE value OR field LIKE value)

MySQL은 그 쿼리를 최적화하지 않습니다.참고하세요.

REGEXP에서 "LIKE IN" 기능을 사용하려는 모든 사용자에게 주의해 주십시오.

IN을 사용하면 다음 작업을 수행할 수 있습니다.

field IN (
'val1',
'val2',
'val3'
)

REGEXP에서는 이것이 동작하지 않는다.

REGEXP '
val1$|
val2$|
val3$
'

다음과 같이 한 줄로 표시해야 합니다.

REGEXP 'val1$|val2$|val3$'

이 방법은 정확합니다.

SELECT * FROM table WHERE field regexp concat_ws("|",(
"111",
"222",
"333"
));

플립 오퍼랜드

'a,b,c' like '%'||field||'%'

간단한 힌트:

자연어처럼 들리고 길이가 짧기 때문에 배리언트 RLIKE(REGEXP와 정확히 같은 명령어)를 사용하는 것이 좋습니다.

"R" 접두사는 물론 Reg. Exp.를 위한 것입니다.

정규 표현을 사용하면 원하는 결과를 얻을 수 있습니다.

SELECT fiberbox from fiberbox where fiberbox REGEXP '[1740|1938|1940]';

위의 쿼리를 테스트할 수 있습니다. SQL fidle을 클릭하십시오.

SELECT fiberbox from fiberbox where fiberbox REGEXP '[174019381940]';

위의 쿼리를 테스트할 수 있습니다. SQL fidle을 클릭하십시오.

다음과 같이 사용할 수도 있습니다.

SELECT * FROM fiberbox WHERE fiber IN('140 ', '1938 ', '1940 ')

다음과 같이 사용할 수도 있습니다.

 SELECT
    * 
FROM
    fiberbox f
    JOIN (
    SELECT
        substring_index( substring_index( '1740,1938,1940', ',', help_topic_id + 1 ), ',',- 1 ) AS sub_ 
    FROM
        mysql.help_topic 
    WHERE
        help_topic_id <(
            length( '1740,1938,1940' )- length(
            REPLACE ( '1740,1938,1940', ',', '' ))+ 1 
        ) AS b 
        ) ON f.fiberBox LIKE concat('%',
    b.sub_,
    '%')

언급URL : https://stackoverflow.com/questions/1127088/mysql-like-in

반응형