복붙노트

[SQL] MySQL의 LIKE IN ()?

SQL

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-지역 로그

해결법

  1. ==============================

    1.regexp와보다 효율적으로 될 수도 있지만 당신은 할 벤치 마크가 거라고 확신, 예를 들어,

    regexp와보다 효율적으로 될 수도 있지만 당신은 할 벤치 마크가 거라고 확신, 예를 들어,

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

    2.폴 딕슨의 대답은 나를 위해 훌륭하게 일했다. 이에 추가하려면, 여기에 내가 정규 표현식을 사용하는 데 관심이있는 사람들의 관찰 사항은 다음과 같습니다

    폴 딕슨의 대답은 나를 위해 훌륭하게 일했다. 이에 추가하려면, 여기에 내가 정규 표현식을 사용하는 데 관심이있는 사람들의 관찰 사항은 다음과 같습니다

    와일드 카드 여러 LIKE 필터를 달성하기 위해 :

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

    사용 정규 표현식 대안 :

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

    REGEXP 따옴표 내와 사이의 값 | (OR) 연산자는 와일드 카드로서 취급된다. 일반적으로, 정규 표현식은 다음과 같은 와일드 카드 표현이 필요합니다. (*) 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의 문에서 작업에 나타납니다. 당신은 당신의 패턴을 테스트하고 작동을 확인해야합니다.

    마지막으로, 여러 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';
    

    사용 정규 표현식 대안 :

    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';
    

    공지 사항 나는이 WHERE 필터 별도의 설정하지 분리. 나는 그래서 앞으로, 부정 패턴을 사용하여 패턴을 찾고, 그리고 실험. 그러나 이러한 표현은 원하는 결과를 산출하지 않은 것으로 보입니다. 위의 첫 번째 예제에서는 일치를 나타 내기 위해 ^ 9999 $를 사용합니다. 이 같은 표현에서 와일드 카드 일치와 특정 일치를 추가 할 수 있습니다. 나열된 두 번째 예에서 볼 수 그러나, 당신은 또한 문 이러한 유형을 혼합 할 수 있습니다.

    성능에 관해서는, 나는 기존의 테이블에 대해 약간의 테스트를 실행하고 내 변화 사이의 차이를 찾을 수 없습니다. 그러나, 나는 성능이 더 큰 데이터베이스, 더 큰 필드 큰 레코드 수 및 더 복잡한 필터에 문제가 될 수 상상한다.

    언제나처럼, 그것은 의미가 위와 같이 사용하는 논리.

    정규 표현식에 대한 자세한 내용을 원한다면, 나는 좋은 참고 사이트와 www.regular-expressions.info 좋습니다.

  3. ==============================

    3.당신은 인라인 뷰 또는 임시 테이블을 만들려면 값을 작성하고이를 실행할 수 있습니다 :

    당신은 인라인 뷰 또는 임시 테이블을 만들려면 값을 작성하고이를 실행할 수 있습니다 :

    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
    

    이 쿼리가 더 나은 서비스를 맞을 수 있도록 이것은, 그러나, '1938 1740'과 같이있는 fiberbox 당신에게 여러 행을 반환 할 수 있습니다 :

    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
            )
    
  4. ==============================

    4.값 목록에 정규 표현식 방법

    값 목록에 정규 표현식 방법

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

    5.죄송합니다, MySQL의에서 LIKE IN과 비슷한 조작은 없습니다.

    죄송합니다, MySQL의에서 LIKE IN과 비슷한 조작은 없습니다.

    당신이 가입없이 LIKE 연산자를 사용하려는 경우, 당신은 이런 식으로해야 할 것이다 :

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

    당신은 MySQL이 참고로, 해당 쿼리를 최적화하지 않습니다 알고있다.

  6. ==============================

    6.정규 표현식을 시도하는 사람에게 그냥 메모 "LIKE IN"기능을 사용할 수 있습니다.

    정규 표현식을 시도하는 사람에게 그냥 메모 "LIKE IN"기능을 사용할 수 있습니다.

    IN은 당신이 할 수 있습니다 :

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

    정규 표현식이 작동하지 않습니다

    REGEXP '
    val1$|
    val2$|
    val3$
    '
    

    그것은이 같은 한 줄에 있어야한다 :

    REGEXP 'val1$|val2$|val3$'
    
  7. ==============================

    7.플립 피연산자

    플립 피연산자

    'a,b,c' like '%'||field||'%'
    
  8. ==============================

    8.이것은 올바른 것입니다 :

    이것은 올바른 것입니다 :

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

    9.그냥 약간의 팁 :

    그냥 약간의 팁 :

    나는 그것이 더 자연 언어 같은 소리, 그리고 짧은으로 변형 RLIKE (정규 표현식과 정확히 동일한 명령)을 사용하는 것을 선호; 물론, 단지 한 문자.

    은 "R"접두사는 등록을위한 것입니다. 특급. 물론.

  10. ==============================

    10.당신은 정규 표현식의 도움으로 결과를 원하는 얻을 수 있습니다.

    당신은 정규 표현식의 도움으로 결과를 원하는 얻을 수 있습니다.

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

    우리는 위의 쿼리를 테스트 할 수 있습니다 SQL 바이올린을 클릭 해주세요

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

    우리는 위의 쿼리를 테스트 할 수 있습니다 SQL 바이올린을 클릭 해주세요

  11. from https://stackoverflow.com/questions/1127088/mysql-like-in by cc-by-sa and MIT license