복붙노트

[SQL] MySQL의 빈 IN 절 매개 변수 목록

SQL

MySQL의 빈 IN 절 매개 변수 목록

당신이 IN 절은 비어 SQL 쿼리를 수행 할 때 어떻게됩니까?

예를 들면 :

SELECT user WHERE id IN ();

(즉 항상 거짓) 예상대로이 문제를 처리하고 MySQL을하지 않습니다 경우 어떻게 내 응용 프로그램 핸들 동적 IN 절 건물이 경우 수 있습니까?

해결법

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

    1.나는 동적으로 IN 목록을 짓고 있어요 응용 프로그램을 가지고 있고, 비어을 끝낼 수 있다면, 때로는 무엇 불가능한 값 목록을 초기화하고 그에 추가 할 수 있습니다. 예를 들면 이 사용자 이름 목록의 경우 즉 가능한 이름이 아니다 이후, 나는 빈 문자열로 시작합니다. 그것이 AUTO_INCREMENT ID가 있다면, 내가 사용합니다 -1 실제 값은 항상 긍정적 때문이다.

    나는 동적으로 IN 목록을 짓고 있어요 응용 프로그램을 가지고 있고, 비어을 끝낼 수 있다면, 때로는 무엇 불가능한 값 목록을 초기화하고 그에 추가 할 수 있습니다. 예를 들면 이 사용자 이름 목록의 경우 즉 가능한 이름이 아니다 이후, 나는 빈 문자열로 시작합니다. 그것이 AUTO_INCREMENT ID가 있다면, 내가 사용합니다 -1 실제 값은 항상 긍정적 때문이다.

    더 불가능 값이 없기 때문에 이것이 가능하지 않은 경우, 당신은 포함하고 WHERE 절에 열 IN ($ 값) 발현 여부를 결정하는 조건을 사용해야합니다.

  2. ==============================

    2.올바른 구문이 쿼리의 가장 가까운 근사치입니다 :

    올바른 구문이 쿼리의 가장 가까운 근사치입니다 :

    SELECT user FROM tbl1 WHERE id IN (SELECT id FROM tbl1 WHERE FALSE);
    

    이는 무조건 빈 결과 집합을 반환합니다. 브래킷의 하위 쿼리는 항상 빈 집합을 반환하고, 빈 세트에 값을 포함하지 않기 때문에 값이 빈 세트에서 찾을 수 없습니다.

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

    3.이것은 나에게뿐만 아니라 0 결과를 제공합니다 :

    이것은 나에게뿐만 아니라 0 결과를 제공합니다 :

    SELECT id FROM User
    WHERE id IN (NULL);
    

    MYSQL 5.6에 시도

  4. ==============================

    4.상시 허위 진술을 사용하여

    상시 허위 진술을 사용하여

    SQL을 작성하기 전에, 배열의 크기를 확인합니다. 크기가 0 인 경우에서와 같이 1 = 2와 여기서 문을 생성한다 :

    SELECT * FROM USERS WHERE name in () 
    

    가된다

    SELECT * FROM USERS WHERE 1 = 2 
    

    은 "하지에서"빈 배열에서 같은 항상 참 문을 생성합니다 :

    SELECT * FROM USERS WHERE name not in () 
    

    가된다

    SELECT * FROM USERS WHERE 1 = 1
    

    이 같은 더 복잡한 쿼리를 위해 작동합니다 :

    SELECT * FROM USERS WHERE (name in () OR name = 'Alice') 
    

    가된다

    SELECT * FROM USERS WHERE (1 = 2 OR name = 'Alice') 
    
  5. ==============================

    5.당신은 id 인 AUTO_INCREMENT를 사용 (1,2,3 ..)와 배열이 비어있는 경우, 당신은 하나 개의 항목 [0]을 추가 할 수 있습니다. 그것은 수 있도록

    당신은 id 인 AUTO_INCREMENT를 사용 (1,2,3 ..)와 배열이 비어있는 경우, 당신은 하나 개의 항목 [0]을 추가 할 수 있습니다. 그것은 수 있도록

    if (empty($arr)) {
       $arr[] = 0;
    }
    
    SELECT user WHERE id IN (0);
    

    그리고 더 MySQL의 구문 분석 오류가 없을 것입니다. 이 경우는 하위 쿼리에 매우 유용합니다 - 메인 쿼리 하위 쿼리 결과에 의존하지 않을 때.

    더 나은 방법 - 배열이 비어있는 경우 쿼리를 호출하지 않습니다.

    $data = null;
    if (!empty($arr)) {
        $data = ... call query
    }
    
  6. ==============================

    6.나는 여전히 IN이 비어있을 때 쿼리를 실행해야한다고 가정; 왼쪽에 예를 들면 ... ON 가입 ... AND IN ().

    나는 여전히 IN이 비어있을 때 쿼리를 실행해야한다고 가정; 왼쪽에 예를 들면 ... ON 가입 ... AND IN ().

    이미 동적으로 응용 프로그램 계층에 IN을 구축하고, 나는 거기에 빈 케이스를 처리 할 것입니다.

    다음은 PHP의 기본 예제입니다

    $condition = 'FALSE' // Could feasibly want TRUE under different circumstances
    if($values){
       $inParams = **dynamically generated IN parameters from $values**;
       $condition = 'IN (' . $inParams . ')';
    }
    
    $sql = 'SELECT * FROM `user` WHERE '.$condition;
    

    당신이 빈 IN으로 쿼리를 실행할 필요가없는 경우, 다음하지 않습니다; 데이터베이스에 자신에게 여행을 저장!

    N.B. 경우에 당신은 차라리 그냥 SQL로 원시 concatting보다, 제대로 IN 매개 변수에서 먼 길 내내 및 바인딩을가는 기능을 사용 / 구축 할 것, 이미 수 없습니다. 이 원시 데이터에 사용되는 경우 이렇게하면 SQL 인젝션에 대한 몇 가지 보호 기능을 제공 할 것입니다.

  7. ==============================

    7.여기에 논리와 쿼리의 실제 컬럼의 개념을 모두 보존 빈리스트에 항상 허위 진술의 또 다른 변형이다.

    여기에 논리와 쿼리의 실제 컬럼의 개념을 모두 보존 빈리스트에 항상 허위 진술의 또 다른 변형이다.

    () 잘못된 ID가로 다시 작성할 수 있습니다 :

    where id <> id;
    

    하지 ()에서 유사 잘못된 부정적인 조건 ID가에 코드를 구축하는 사용자 지정 쿼리에 의해 변형 될 수있다 :

    where id = id;
    

    이러한 접근 방식은 NULL로 평가하지 않는 ID를하지 (NULL)에 비해 안전하다.

    하지만이 결과의 ID가 null 행을 필터링 것이라고 조심. 이는 경우에 따라 기능이 고려 될 수있다.

    중첩 된 빌더가 결과 부질 이상 어떻게 사용될 수 있는지를 인식하지 못합니다 복잡한 누적 쿼리 작성의 논리에 특히 유용합니다.

  8. ==============================

    8.당신은 당신이 예를 들어 그것으로 뭔가 NULL을 넣어해야합니다 비우 연산자 IN 떠날 수 없다. 그러나 심지어이 경우, 예상대로 NULL과 비교하면 항상 (빈) NULL을 반환하기 때문에, 작동하지 않는 것입니다. 한 가지 가능한 해결책은 부속을 추가하는 것입니다.

    당신은 당신이 예를 들어 그것으로 뭔가 NULL을 넣어해야합니다 비우 연산자 IN 떠날 수 없다. 그러나 심지어이 경우, 예상대로 NULL과 비교하면 항상 (빈) NULL을 반환하기 때문에, 작동하지 않는 것입니다. 한 가지 가능한 해결책은 부속을 추가하는 것입니다.

    예:

    SELECT user_id FROM users;
    
    +-----------+
    | user_id   |
    +-----------+
    |      1000 |
    |      1001 |
    |      1002 |
    |      1003 |
    |      1004 |
    |      1005 |
    |      1006 |
    |      1007 |
    |      1008 |
    |      1009 |
    |      1010 |
    +-----------+
    
    SELECT user_id FROM users WHERE user_id NOT IN ();
    ERROR: 1064: You have an error in your SQL syntax; check the manual that 
    corresponds to your MySQL server version for the right syntax to use near ')' at line 1
    
    SELECT user_id FROM users WHERE user_id NOT IN (NULL);
    Empty set (0.0003 sec)    
    
    SELECT user_id FROM users WHERE user_id IN (1001, 1002, 1003) 
    AND user_id NOT IN (SELECT user_id FROM users WHERE user_id IN (NULL));
    +---------+
    | user_id |
    +---------+
    |    1001 |
    |    1002 |
    |    1003 |
    +---------+
    3 rows in set (0.0004 sec)
    

    그들은 또한 것이다 조금 더 천천히, 당신은 조금 (Lite 버전) 쿼리를 수정 칼, 그러나 나는 생각한다.

  9. ==============================

    9.당신은 응용 프로그램에서 해당 쿼리를 사용하고 쿼리를 동적으로 개체의 목록을 전달하면, 내가 데이터베이스 쿼리를 호출하지 않고 빈 목록을 반환해야 불가능한 값으로 선택을하기 위해 데이터베이스에 호출하지 않아야합니다 직접.

    당신은 응용 프로그램에서 해당 쿼리를 사용하고 쿼리를 동적으로 개체의 목록을 전달하면, 내가 데이터베이스 쿼리를 호출하지 않고 빈 목록을 반환해야 불가능한 값으로 선택을하기 위해 데이터베이스에 호출하지 않아야합니다 직접.

    이 쿼리를 수행 할 감각이 없기 때문에 당신은 그것을 호출하기 전에 비어 알고있다.

  10. from https://stackoverflow.com/questions/13210233/empty-in-clause-parameter-list-in-mysql by cc-by-sa and MIT license