2016-08-10 34 views
-1

如何編寫sql查詢以從其where列中的列根據發送內容具有不同值的表中選擇行。 示例:發送的參數對於單個列名稱具有3個不同的值。 我如何檢索滿足所有參數的行。用於選擇具有不同值的單行的行的查詢

+1

從TableA中選擇*其中Column1 IN(1,2,3)? – Veljko89

+0

添加樣品表數據和預期結果! – jarlh

+0

@ Veljko89參數(值)的數量每次都會改變。基於從複選框中選擇的內容。 – ExTincT

回答

0

您可以使用IN/NOT IN構造...

要匹配所有具有參數中的列值的列:

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

匹配所有不具有的列其列值在參數之中:

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)) 

通過這種方式,你可以通過查詢使用給定分隔符的單個參數中的x值列表。

以上示例用於分隔字符串值。然而很容易產生一個返回整數的表格,只需通過改變表項的類型和改變線路fnSplitInt「INSERT INTO ...」到:

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

PostgreSQL的功能相同樣子:

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, ','))); 

或者你可以寫一個Functioncomma_separated_values作爲輸入參數,像

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; 

編輯:您可以創建另一個函數以text arrayinput 參數

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

相關問題