programing

MySQL에서 IN 절 매개 변수 목록 비우기

bestcode 2022. 9. 24. 12:43
반응형

MySQL에서 IN 절 매개 변수 목록 비우기

SQL 쿼리를 실행하면 어떤 일이 발생합니까?IN절이 비어 있습니까?

예를 들어 다음과 같습니다.

SELECT user WHERE id IN ();

MySQL은 이 문제를 예상대로 처리할 수 있습니까(즉, 항상 false), 그렇지 않은 경우 응용 프로그램은 이 문제를 어떻게 처리할 수 있습니까?IN절은 동적으로?

어플리케이션을 만들고 있는 경우IN목록을 동적으로 나열하면 비워질 수 있습니다. 가끔은 불가능한 값으로 목록을 초기화하고 여기에 추가합니다.예를 들어 사용자 이름 목록인 경우 빈 문자열로 시작합니다. 빈 문자열은 사용 가능한 사용자 이름이 아니기 때문입니다.auto_increment ID일 경우 실제 값은 항상 양의 값이기 때문에 -1을 사용합니다.

불가능한 값이 없기 때문에 이것이 가능하지 않은 경우 조건을 사용하여 포함 여부를 결정해야 합니다.AND column IN ($values)의 표현WHERE절을 클릭합니다.

결과도 0개입니다.

SELECT id FROM User
WHERE id IN (NULL);

MYSQL 5.6에서 시행.

유효한 구문을 가진 이 쿼리의 가장 가까운 근사치는 다음과 같습니다.

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

무조건 빈 결과 세트를 반환합니다.괄호 내의 서브쿼리는 항상 빈 세트를 반환하며 빈 세트에는 값이 포함되어 있지 않기 때문에 빈 세트에는 값이 없습니다.

항상 false 스테이트먼트 사용

SQL을 생성하기 전에 어레이 크기를 확인하십시오.크기가 0인 경우 where 문을 생성합니다.1 = 2예를 들어 다음과 같습니다.

SELECT * FROM USERS WHERE name in () 

된다

SELECT * FROM USERS WHERE 1 = 2 

빈 배열에 "not in"인 경우 다음과 같이 항상 true 문을 생성합니다.

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

IN 연산자를 비워둘 수 없습니다. 뭔가 넣어야 합니다.NULL예를들면.하지만 이 경우에도 예상대로 작동하지 않습니다.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)

조금 수정(축소)되는 쿼리는 있지만, 조금 더 느려질 수도 있습니다.

ID(1, 2, 3, ..)에 AUTO_INCREMENT를 사용하고 배열이 비어 있으면 항목 [0]을 1개 추가할 수 있습니다.그래서 그렇게 될 거야

if (empty($arr)) {
   $arr[] = 0;
}

SELECT user WHERE id IN (0);

또한 mysql 해석 오류는 발생하지 않습니다.이 경우 기본 쿼리가 하위 쿼리 결과에 의존하지 않는 경우 하위 쿼리에서 매우 유용합니다.


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

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

다음으로 빈 목록에 대한 always false 스테이트먼트의 다른 변형으로 쿼리의 로직과 실제 컬럼의 개념을 모두 보존합니다.

id in ()이치하다

where id <> id;

로 조건입니다.id not in ()커스텀 쿼리 빌드 코드를 사용하여 다음과 같이 변환할 수 있습니다.

where id = id;

이 접근방식은 NULL로 평가되지 않기 때문에 안전합니다.

, 「 」, 「 」, 「 」의 행은 해 주세요.id is null이것은 경우에 따라서는 기능으로 간주될 수 있습니다.

중첩된 작성자가 위의 결과 하위 쿼리를 어떻게 사용할 수 있는지 모르는 복잡한 누적 쿼리 빌드 로직에서 특히 유용합니다.

아직 쿼리를 실행해야 할 것 같습니다.IN비어 있습니다.를 들어, 비있((((((((( ) 。LEFT JOIN ... 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. 아직 그렇지 않은 경우, 저는 오랜 시간 동안 이 기능을 구축/사용할 것입니다.IN파라미터를 SQL에 raw로 합성하는 것이 아니라 파라미터를 적절히 조합할 수 있습니다.이렇게 하면 원시 데이터에 SQL 주입을 사용하는 경우 SQL 주입으로부터 어느 정도 보호할 수 있습니다.

이 문제를 해결하는 방법 중 하나는 다음과 같습니다.

SELECT user WHERE id in (SELECT 1 WHERE 1!=1)

을 @1" @James의 적절한 .Houx의 코멘트에 기재되어 있는 적절한 데이터 타입의 값으로 대체할 필요가 있습니다.
아이디 int int.

응용 프로그램에서 해당 쿼리를 사용하여 오브젝트 목록을 쿼리에 동적으로 전달할 경우 데이터베이스에 호출하여 불가능한 값을 선택할 수 없습니다.데이터베이스 쿼리에 직접 호출하지 않고 빈 목록을 반환해야 합니다.

빈 쿼리를 호출하기 전에 실행하는 것은 의미가 없기 때문입니다.

언급URL : https://stackoverflow.com/questions/13210233/empty-in-clause-parameter-list-in-mysql

반응형