Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换postgresql 9.3中特定索引的值_Postgresql_Postgresql 9.3 - Fatal编程技术网

替换postgresql 9.3中特定索引的值

替换postgresql 9.3中特定索引的值,postgresql,postgresql-9.3,Postgresql,Postgresql 9.3,当我运行此查询时 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

当我运行此查询时

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;
它给我这样的输出

SELECT array_replace(array[1,20,2,5]);
现在我不知道为什么会出现这种重复值。我的意思是它是一个嵌套的循环

我需要这样的输出

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

您有一个双循环,其中
x
数组有两个元素。在每次迭代中,您都会将元素推送到结果数组上,因此得到的值是原来的两倍

如果我正确理解了您的逻辑,那么您需要以相同的顺序扫描输入数组以查找另一个数组的值。如果相同,则用另一个数组替换这些值,保留其他值不变。这里没有内置函数可以帮助您,因此您必须从头开始:

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

正如您所见,它适用于多次出现的搜索数组。

首先感谢您的回答。重点是我需要一个嵌套循环,因为对于每个所需的数组,比如数组[1,20,2,5]);我会给出类似的机器值,比如数组[1,20],替换的结果是这样的[1.11,1111,20.2,20.222]。。因此这里的替换类似于数组[1.11,1111,20.2,20.222,2,5]);你认为没有嵌套循环是可能的吗?
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;
patrick@puny:~$ 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)