2016-08-10 9 views
-1

送信される内容に基づいてwhere句の列の値が異なるテーブルから行を選択するSQLクエリを作成する方法。 例:送信されるパラメータには、単一の列名に対して3つの異なる値があります。 どのようにすべてのパラメータを満たす行を取得しますか。異なる列の値を持つ行を選択するクエリ

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

が持っていないすべての列を一致させるには:

+1

Select * from TableAここで、Column1 IN(1,2,3)? – Veljko89

+0

サンプルテーブルのデータと期待される結果を追加してください! – jarlh

+0

@ Veljko89パラメータ(値)の数は、チェックボックスから選択されたものに基づいて毎回変わります。 – ExTincT

答えて

0

あなたは

は、パラメータの中でその列の値を持つすべての列を一致させるには...以下の詳細を構築することはしない/ INを使用することができますパラメータの中のその列の値:

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 

をあなたは今の線に沿って、クエリ書くことができるようになります:あなたは、クエリaを渡すことができます。このように

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

をので、自分で関数を作成した場合

指定された区切り文字を持つ単一のパラメータの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, ','))); 

EDIT

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_valuesでもFunctionを書くことができます:あなたは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

関連する問題