[SQL] MySQL의 빈 IN 절 매개 변수 목록
SQLMySQL의 빈 IN 절 매개 변수 목록
당신이 IN 절은 비어 SQL 쿼리를 수행 할 때 어떻게됩니까?
예를 들면 :
SELECT user WHERE id IN ();
(즉 항상 거짓) 예상대로이 문제를 처리하고 MySQL을하지 않습니다 경우 어떻게 내 응용 프로그램 핸들 동적 IN 절 건물이 경우 수 있습니까?
해결법
-
==============================
1.나는 동적으로 IN 목록을 짓고 있어요 응용 프로그램을 가지고 있고, 비어을 끝낼 수 있다면, 때로는 무엇 불가능한 값 목록을 초기화하고 그에 추가 할 수 있습니다. 예를 들면 이 사용자 이름 목록의 경우 즉 가능한 이름이 아니다 이후, 나는 빈 문자열로 시작합니다. 그것이 AUTO_INCREMENT ID가 있다면, 내가 사용합니다 -1 실제 값은 항상 긍정적 때문이다.
나는 동적으로 IN 목록을 짓고 있어요 응용 프로그램을 가지고 있고, 비어을 끝낼 수 있다면, 때로는 무엇 불가능한 값 목록을 초기화하고 그에 추가 할 수 있습니다. 예를 들면 이 사용자 이름 목록의 경우 즉 가능한 이름이 아니다 이후, 나는 빈 문자열로 시작합니다. 그것이 AUTO_INCREMENT ID가 있다면, 내가 사용합니다 -1 실제 값은 항상 긍정적 때문이다.
더 불가능 값이 없기 때문에 이것이 가능하지 않은 경우, 당신은 포함하고 WHERE 절에 열 IN ($ 값) 발현 여부를 결정하는 조건을 사용해야합니다.
-
==============================
2.올바른 구문이 쿼리의 가장 가까운 근사치입니다 :
올바른 구문이 쿼리의 가장 가까운 근사치입니다 :
SELECT user FROM tbl1 WHERE id IN (SELECT id FROM tbl1 WHERE FALSE);
이는 무조건 빈 결과 집합을 반환합니다. 브래킷의 하위 쿼리는 항상 빈 집합을 반환하고, 빈 세트에 값을 포함하지 않기 때문에 값이 빈 세트에서 찾을 수 없습니다.
-
==============================
3.이것은 나에게뿐만 아니라 0 결과를 제공합니다 :
이것은 나에게뿐만 아니라 0 결과를 제공합니다 :
SELECT id FROM User WHERE id IN (NULL);
MYSQL 5.6에 시도
-
==============================
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.당신은 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.나는 여전히 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.여기에 논리와 쿼리의 실제 컬럼의 개념을 모두 보존 빈리스트에 항상 허위 진술의 또 다른 변형이다.
여기에 논리와 쿼리의 실제 컬럼의 개념을 모두 보존 빈리스트에 항상 허위 진술의 또 다른 변형이다.
() 잘못된 ID가로 다시 작성할 수 있습니다 :
where id <> id;
하지 ()에서 유사 잘못된 부정적인 조건 ID가에 코드를 구축하는 사용자 지정 쿼리에 의해 변형 될 수있다 :
where id = id;
이러한 접근 방식은 NULL로 평가하지 않는 ID를하지 (NULL)에 비해 안전하다.
하지만이 결과의 ID가 null 행을 필터링 것이라고 조심. 이는 경우에 따라 기능이 고려 될 수있다.
중첩 된 빌더가 결과 부질 이상 어떻게 사용될 수 있는지를 인식하지 못합니다 복잡한 누적 쿼리 작성의 논리에 특히 유용합니다.
-
==============================
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.당신은 응용 프로그램에서 해당 쿼리를 사용하고 쿼리를 동적으로 개체의 목록을 전달하면, 내가 데이터베이스 쿼리를 호출하지 않고 빈 목록을 반환해야 불가능한 값으로 선택을하기 위해 데이터베이스에 호출하지 않아야합니다 직접.
당신은 응용 프로그램에서 해당 쿼리를 사용하고 쿼리를 동적으로 개체의 목록을 전달하면, 내가 데이터베이스 쿼리를 호출하지 않고 빈 목록을 반환해야 불가능한 값으로 선택을하기 위해 데이터베이스에 호출하지 않아야합니다 직접.
이 쿼리를 수행 할 감각이 없기 때문에 당신은 그것을 호출하기 전에 비어 알고있다.
from https://stackoverflow.com/questions/13210233/empty-in-clause-parameter-list-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SSIS를 사용하면 파일에 테이블 데이터의 XML 표현을 추출 (0) | 2020.05.29 |
---|---|
[SQL] MySQL의 GroupWise에 MAX ()는 예기치 않은 결과를 반환 (0) | 2020.05.29 |
[SQL] 어떻게 두 번째로 높은 급여와 직원을 찾는 방법은? (0) | 2020.05.28 |
[SQL] SQL 문에서 사용하는 R 스크립트 문자열 변수 전달 (0) | 2020.05.28 |
[SQL] 는 SQL 트랜잭션의 동시성 처리 (0) | 2020.05.28 |