2016-01-20 45 views
0
CREATE OR REPLACE FUNCTION array_replace(INT[]) RETURNS float[] AS $$ 
DECLARE 
    arrFloats ALIAS FOR $1; 
    J int=0; 
    x int[]=ARRAY[2,4]; 
    -- xx float[]=ARRAY[2.22,4.33]; 
    b float=2.22; 
    c float=3.33; 
    retVal float[]; 
BEGIN 
    FOR I IN array_lower(arrFloats, 1)..array_upper(arrFloats, 1) LOOP 
    FOR K IN array_lower(x, 1)..array_upper(x, 1) LOOP 
     IF (arrFloats[I]= x[K])THEN 
     retVal[j] :=b; 
     j:=j+1; 
     retVal[j] :=c; 
     j:=j+1; 
     ELSE 
     retVal[j] := arrFloats[I]; 
     j:=j+1;  
     END IF; 
    END LOOP; 
    END LOOP; 
    RETURN retVal; 
END; 
$$ LANGUAGE plpgsql STABLE RETURNS NULL ON NULL INPUT; 

具體指標的值當我運行此查詢替換的PostgreSQL 9.3

SELECT array_replace(array[1,20,2,5]); 

它給我這個樣子

"[0:8]={1,1,20,20,2.22,3.33,2,5,5}" 

輸出現在我不知道爲什麼要來此重複值。我的意思是馬上嵌套循環...

我需要這樣一個

"[0:8]={1,20,2.22,3.33,5}" 

回答

0

一個輸出你必須與x陣列,具有兩個元素的雙迴路。在每次迭代中,您都會將元素推送到結果數組中,因此您可以獲得兩倍的值。

如果我正確理解您的邏輯,您希望以相同的順序掃描輸入數組的值。如果相同,則將這些值替換爲另一個數組,使其他值保持不變。有沒有內置的功能,幫助你在這裏,所以你必須從頭做到這一點:

CREATE FUNCTION array_replace(arrFloats float[]) RETURNS float[] AS $$ 
DECLARE 
    searchArr float[] := ARRAY[1.,20.]; 
    replaceArr float[] := ARRAY[1.11,1.,111.,20.2,20.222]; 
    retVal  float[]; 
    i int; 
    ndx int; 
    len int; 
    upp int; 
    low int 
BEGIN 
    low := array_lower(searchArr, 1) 
    upp := array_upper(searchArr, 1); 
    len := upp - low + 1; 
    i := array_lower(arrFloats, 1); 
    WHILE i <= array_upper(arrFloats, 1) LOOP -- Use WHILE LOOP so can update i 
    ndx := i; -- index into arrFloats for inner loop 
    FOR j IN low .. upp LOOP 
     IF arrFloats[ndx] != searchArr[j] THEN 
     -- No match so put current element of arrFloats in the result and update i 
     retVal := retVal || arrFloats[i]; 
     i := i + 1; 
     EXIT; -- No need to look further, break out of inner loop 
     END IF; 
     ndx := ndx + 1; 
     IF j = upp THEN 
     -- We have a match so append the replaceArr to retVal and 
     -- increase i by length of search_array 
     retVal := retVal || replaceArr; 
     i := i + len; 
     END IF; 
    END LOOP; 
    END LOOP; 
    RETURN retVal; 
END; 
$$ LANGUAGE plpgsql STABLE STRICT; 

如果您做了searchArrreplaceArr成多個參數,以及該功能將變得更加靈活。

測試

[email protected]:~$ psql -d test 
psql (9.5.0, server 9.4.5) 
Type "help" for help. 

test=# select array_replace(array[1,20,2,5]); 
     array_replace 
------------------------------ 
{1.11,1,111,20.2,20.222,2,5} 
(1 row) 

test=# select array_replace(array[1,20,2,5,1,20.1,1,20]); 
         array_replace 
------------------------------------------------------------ 
{1.11,1,111,20.2,20.222,2,5,1,20.1,1.11,1,111,20.2,20.222} 
(1 row) 

正如你可以看到它的工作原理爲搜索陣列的多個實例。

+0

首先感謝您的迴應。關鍵是我需要一個嵌套循環,因爲對於每個所需的數組,讓我們說數組[1,20,2,5]);我會給喜歡maching值讓說數組[1,20]和替換將是這樣[1.11,1,111,20.2,20.222] ..所以這裏的替換將像數組[1.11,1,111,20.2,20.222,2 ,5]);你認爲沒有嵌套循環可能嗎? – zahid

+0

查看我的更新回答,輸出 – Patrick

+0

感謝帕特里克爲您的答案...亞很好.... – zahid