2011-12-06 3 views
5

MySQL에서 쿼리하는 데 어려움을 겪고 있습니다.IN 절과 매개 변수가있는 MySQL 잘못된 출력

저는 Delphi XE로 작업 중이며 일부 매개 변수를 사용하여 MySQL에 쿼리를 보내고 있습니다. 다음은 쿼리에 대한 예입니다 :

SELECT * FROM users u WHERE u.id IN (:idUsers); 

'idUsers은'나는이 같은 포맷이 포함 된 문자열입니다 델파이, 예 : 1, 2와 함께 보낼 매개 변수를받을 변수입니다, 3

문제는이 문자열을 사용하면 첫 번째 사용자 (id = 1) 만 받는다는 것입니다. 내가 볼 수있는 것부터, MySQL과 마찬가지로 1,2,3 대신 '1,2,3'처럼 문자열의 시작과 끝에 몇 개의 따옴표 ('')를 추가합니다. 나는이 선택을 시도했습니다 ..

SELECT * FROM users u WHERE u.id IN ('1,2,3'); 

그것은 참으로 첫 번째 사용자 반환하지

나는 발송에 실패 문자열을 분할하고 임시 테이블을 반환 된 MSSQL의 기능을 가지고 있지만, 최근에 MySQL로 전환했고, 내가 읽었던 것에서, MySQL은 테이블 반환을 허용하지 않습니다.

누구나이 문제를 해결하는 방법에 대한 단서가 있습니까? 저는 웹에서 답을 찾아 냈는데이 특정 문제에 대한 답변을 찾지 못했습니다.

도움 주셔서 감사합니다.

+0

여기에 코드를 붙여 넣을 수 있습니까? 비슷한 종류의 쿼리를 사용하여 언제든지이 오류를 발견하지 못했습니다. – Shirish11

답변

10

매개 변수가 그렇게 작동하지 않습니다. 그들은 당신이 제공하려고하는 것이 쉼표로 구분 된 값 목록이라는 것을 전혀 모릅니다. ParamByName('WhatEver').AsString 또는 Value을 설정하면 해당 매개 변수에 속한 모든 것을 포함하는 인용 문자열을 의미한다고 생각합니다. 그래서 그것은 정확하게 보이는 것을하고 있습니다 - IN (1, 2, 3) 대신에 IN ('1, 2, 3')을 전달합니다.

스스로 다시 구문 분석하고 임시 테이블을 사용하거나 WHERE 절을 동적으로 빌드하고 쿼리를 실행하기 전에 연결해야합니다. 실제로 쿼리를 동적으로 작성하고 IN 절에있는 각 항목에 대한 새 매개 변수를 만든 다음 동적으로 생성 된 각 매개 변수에 루프백하고 값을 할당 할 수 있지만 매우 추악합니다.

+0

답장을 보내 주셔서 감사합니다. Delphi에서 쿼리를 연결 한 다음 쿼리를 실행하면 작동합니다. 응용 프로그램에 필요한 모든 쿼리가 들어있는 테이블에서 쿼리를 가져 오는 중이므로 동적으로 쿼리를 작성하지 않아도됩니다. 내가 한 것은 매개 변수 ": idUsers"를 "$ idUsers"로 대체하고 Delphi 내부에서 "$ idUsers"의 AnsiStrReplace를 미리 작성한 문자열로 처리하는 것입니다. – Simon

+0

:) 다행이라고 생각합니다.훌륭한 솔루션 (마치 SQL 주입에 대해 걱정할 필요가없는 한)처럼 들립니다. –

0

가변 수의 매개 변수가 IN 절에있는 경우 MYSQL (ID라는 열만 포함)에 임시 테이블을 작성하고 임시 테이블에 매개 변수 값을로드 한 다음 다음과 같이 수행 할 수 있습니다.

SELECT * FROM users u WHERE u.id IN (SELECT ID FROM TEMPTABLE); 

TEMPTABLE에 조회하려는 값만 포함되어 있으면 테이블 공간 스캔이 허용됩니다.

그런 다음 다양한 수의 값을 가질 수 있습니다. 테이블을 영구적으로 만들고 매개 변수를 저장할 수도 있습니다. 사용자에 대한 열을 추가하면 각 사용자가 개별 매개 변수를 저장할 수 있습니다.

+0

이것은 원래의 질문과 제 대답 모두에서 이미 언급되었습니다. :) –

+0

죄송합니다. 언급을 놓쳤습니다. – David

관련 문제