2016-08-10 2 views
-1

SQL 쿼리를 작성하여 보내지는 항목에 따라 where 절의 열에 다른 값이있는 테이블에서 행을 선택하는 방법. 예 : 전송 된 매개 변수에는 단일 열 이름에 대해 3 개의 다른 값이 있습니다. 어떻게 모든 매개 변수를 만족하는 행을 검색합니까?단일 열의 다른 값을 가진 행 선택에 대한 쿼리

SELECT * FROM table WHERE `columnName` IN ('parameter1','parameter2','parameter3'); 

가지고 있지 않은 모든 열을 일치 시키려면 :

+1

* TableA에서 선택 * 여기서 Column1 IN (1,2,3)? – Veljko89

+0

샘플 테이블 데이터 및 예상 결과를 추가하십시오! – jarlh

+0

@ Veljko89 매개 변수 (값)의 수는 확인란에서 선택된 항목에 따라 매번 바뀝니다. – ExTincT

답변

0

당신은

이 매개 변수들 사이의 열 값이 모든 열을 일치 시키려면 더 ... 건설 NOT /에서 사용할 수있는 매개 변수 중 해당 열 값 :

SELECT * FROM table WHERE `columnName` NOT IN ('parameter1','parameter2','parameter3'); 
+0

나는 40 가지의 다른 값을 매치해야한다. – ExTincT

0

나는 잠재적 인 값의 수가 크고 불확실합니다.

경우에 따라서 자신에게 함수를 만들 :

CREATE FUNCTION [dbo].[fnSplit](
    @sInputList VARCHAR(max) -- List of delimited items 
    , @sDelimiter VARCHAR(5) -- delimiter that separates items 
) RETURNS @List TABLE (item VARCHAR(max)) 

BEGIN 
DECLARE @sItem VARCHAR(max) 
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 
BEGIN 
SELECT 
    @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), 
    @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) 

IF LEN(@sItem) > 0 
    INSERT INTO @List SELECT @sItem 
END 

IF LEN(@sInputList) > 0 
INSERT INTO @List SELECT @sInputList -- Put the last item in 
RETURN 
END 

이제의 라인을 따라 쿼리 쓸 수 있습니다 :이 방법으로

SELECT * FROM myTable WHERE myColumn IN 
    (SELECT * FROM dbo.fnSplit(stringParamHere, stringSeparatorHere)) 

를 쿼리 a를 전달할 수 있습니다 주어진 매개 변수와 함께 단일 매개 변수의 x 값 목록.

위의 예는 문자열 값을 구분하는 데 사용됩니다. PostgreSQL를위한

INSERT INTO @List SELECT CAST(@sItem as int) 

같은 기능 :에 "... INSERT INTO"단순히 테이블 항목의 유형을 변경하고 라인을 변경하여, INT의 테이블을 반환하는 fnSplitInt을 생산하지만 매우 쉽습니다 다음과 같습니다

CREATE OR REPLACE FUNCTION public.fnsplit(
    IN stringlist character varying, 
    IN delimit character varying) 
    RETURNS TABLE(items character varying) AS 
$BODY$ 
declare remainderlist character varying; 
declare front character varying; 
declare delimitpos integer; 
begin 
    drop table if exists tmptbl; 
    create temp table tmptbl(items character varying); 
    remainderlist := $1; 
    delimitpos := strpos(remainderlist, $2); 
    while delimitpos > 0 loop 
     front := trim(both from(left(remainderlist, delimitpos -1))); 
     remainderlist := substr(remainderlist, delimitpos + 1); 
     if length(front) > 0 then 
      insert into tmptbl values (front); 
     end if; 
     delimitpos := strpos(remainderlist, $2); 
    end loop; 
    --insert last value 
    remainderlist := trim(both from remainderlist); 
    if length(remainderlist) > 0 then 
     insert into tmptbl values (remainderlist); 
    end if; 
    return query 
     select * from tmptbl; 
     return; 
end; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100 
    ROWS 1000; 

HTH

0

이 값의 큰 수와 일치하는 것을 시도

SELECT * FROM table WHERE columnName IN (select 
unnest(regexp_split_to_array(comma_separated_values::text, ','))); 

는 다른 방법으로 당신은

CREATE OR REPLACE FUNCTION myFunction(comma_separated_values Text) 
    RETURNS refcursor AS 

$BODY$ 
DECLARE 
cur_data refcursor; 

begin 
open cur_data for 
SELECT * FROM table WHERE columnName IN (select 
    unnest(regexp_split_to_array(comma_separated_values::text, ','))); 
    return cur_data ; 
end; 

$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

편집과 같은 입력 매개 변수로 comma_separated_valuesFunction도 쓸 수 있습니다 : 당신이 text array input과 같은 매개 변수

CREATE OR REPLACE FUNCTION myFunction(values Text[]) 
     RETURNS refcursor AS 

    $BODY$ 
    DECLARE 
    cur_data refcursor; 

    begin 
    open cur_data for 
    SELECT * FROM table WHERE columnName IN (select unnest(values)); 
     return cur_data ; 
    end; 

    $BODY$ 
     LANGUAGE plpgsql VOLATILE 
     COST 100; 

와 다른 기능을 만들 수 있습니다 희망이 도움이 .

+0

나는 그것을 내 매개 변수를 만족시키는 행을 선택하고 목록에 추가하기 위해 Java에서 작동시켰다. – ExTincT

관련 문제