送信される内容に基づいてwhere句の列の値が異なるテーブルから行を選択するSQLクエリを作成する方法。 例:送信されるパラメータには、単一の列名に対して3つの異なる値があります。 どのようにすべてのパラメータを満たす行を取得しますか。異なる列の値を持つ行を選択するクエリ
SELECT * FROM table WHERE `columnName` IN ('parameter1','parameter2','parameter3');
が持っていないすべての列を一致させるには:
送信される内容に基づいてwhere句の列の値が異なるテーブルから行を選択するSQLクエリを作成する方法。 例:送信されるパラメータには、単一の列名に対して3つの異なる値があります。 どのようにすべてのパラメータを満たす行を取得しますか。異なる列の値を持つ行を選択するクエリ
SELECT * FROM table WHERE `columnName` IN ('parameter1','parameter2','parameter3');
が持っていないすべての列を一致させるには:
あなたは
は、パラメータの中でその列の値を持つすべての列を一致させるには...以下の詳細を構築することはしない/ INを使用することができますパラメータの中のその列の値:
SELECT * FROM table WHERE `columnName` NOT IN ('parameter1','parameter2','parameter3');
私は40の異なる値に一致しなければならない。 – ExTincT
私はあなたが潜在的な値の数が大きく、不確定であると思います。
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
が、これは多数の値を一致させるようにしてください
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;
で別の関数を作成することができますが、それが役に立てば幸い。
私はそれを自分のパラメータを満たし、リストに追加する行を選択するためにJavaで動作させました – ExTincT
Select * from TableAここで、Column1 IN(1,2,3)? – Veljko89
サンプルテーブルのデータと期待される結果を追加してください! – jarlh
@ Veljko89パラメータ(値)の数は、チェックボックスから選択されたものに基づいて毎回変わります。 – ExTincT