2014-04-28 2 views
0

데이터베이스 내의 레코드를 찾는 방법으로 반복 SQL 쿼리를하고 싶습니다. 테이블 이름은 길고 짜증나지만, 최소한의 예제로 이해하려고 노력할 것입니다. 나는 특정 특성을 가진 자동차를 찾기 위해 자동차 테이블을 찾고있다. 일반적으로,이 매우 쉬울 것이다 :테이블을 만들지 않고 SQL 반복?

SELECT vin FROM cars WHERE color = 'red' AND interior = 'cloth' 

그러나, 사용자는 내가 그 특성을 기준으로 필터링하고 싶지 않은 경우에 '없음 기본 설정'옵션을 선택할 수 있습니다. 나는 사용자 입력에 의해 정의된다 @color 조건 하위 쿼리와 함께이 문제를 해결 얻을 :

SELECT vin FROM cars WHERE id IN 
(SELECT CASE 
    WHEN @color = 'No Preference' THEN id 
    WHEN color = @color THEN id) 
AND id IN 
(SELECT CASE 
    WHEN @interior = 'No Preference' THEN id 
    WHEN interior = @interior THEN id) 

아무것도 '어떤 성향'이없는 경우는 모든 레코드 세트를 선택하기 때문에 작동 (이 함께 I AND 다 같이 것이다 내가 어떤 것도 잃지 않도록).

그러나 많은 자동차 사양을 기준으로 필터링 할 지금 필요하며, 내가 함께이 하위 쿼리의 모든 다음 AND을 쓸 수 있지만, 나는 똑똑한 방식으로 그것을 할 수있을 것 같은 느낌. 내가 이해하는 것으로부터, SQL의 반복은 쉽게 할 수 있습니다. <> 'No Preference' 인 모든 자동차 사양을 포함하는 테이블을 만들고 그 위에 반복합니다.

이것은 개발자 데이터베이스 액세스에서 올바르게 작동합니다. 그러나 계정 최종 사용자 자격 증명으로 작성된 쿼리에는 CREATE 또는 DROP 권한이 없으므로 테이블 생성은 여기에 대한 옵션이 아닙니다.

새 테이블을 만들지 않고 이러한 하위 쿼리를 반복적으로 수행 할 수있는 방법이 있습니까?

+0

OR 할 수 있습니까? 그래서 WHERE (color = 'red'OR color = 'No Preference') AND interior = 'cloth' – stomo21

+0

와우, 할 수있을 것 같아. 하위 쿼리 로직을 확실히 고려했습니다. 'OR'-ing ~ 70 문장은 여전히 ​​조금은 보인다 (반복적으로하고 싶다) – Luigi

+0

어떤 DBMS를 사용하고 있습니까? SQL Server/T-SQL과 비슷합니까? –

답변

1

입력 내용을 기반으로 동적 SQL 문을 작성하려는 것 같습니다. 다음과 같이하십시오 :

DECLARE @sqlstmt VARCHAR(MAX) 
SET @sqlstmt = 'SELECT vin FROM cars WHERE 1=1' 
IF @interior<>'No Preference' 
    SET @sqlstmt = @sqlstmt + ' AND interior = '''[email protected]+''' 
IF @color<>'No Preference' 
    SET @sqlstmt = @sqlstmt + ' AND color = '''[email protected]+''' 
... 
exec(@sqlstmt) 

명백하게, 당신은 sql injection에 대해 필터링해야합니다. 그러나이 논리는 시작해야합니다.

0

아니요. 반복은 SQL에서 좋지 않습니다. SQL은 세트로 조작합니다. 이 쉬운 패턴으로 술어를 작성할 수 있습니다.

WHERE 
    (interior = @interior OR @interior = 'No Preference') 
AND (color = @color OR @color = 'No Preference') 
... 
관련 문제