Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
Sql 如何比较返回游标的函数中的行_Sql_Oracle_Plsql - Fatal编程技术网

Sql 如何比较返回游标的函数中的行

Sql 如何比较返回游标的函数中的行,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个函数,它返回游标并返回4行,其中包含IDnumber、namevarchar、valuenumber、GAME_NAME_IDnumber、GNAMEvarchar、RNUMnumber 现在我必须将这个函数的第三行与其他一些参数进行比较 这是函数和输出 select aff_setings.v$list_game_parameters_for_aff(4355,15,0,20) from dual; Cursor (GAME_PARAMETAR_ID, NAME, VALUE, GA

我有一个函数,它返回游标并返回4行,其中包含IDnumber、namevarchar、valuenumber、GAME_NAME_IDnumber、GNAMEvarchar、RNUMnumber

现在我必须将这个函数的第三行与其他一些参数进行比较

这是函数和输出

select aff_setings.v$list_game_parameters_for_aff(4355,15,0,20) from dual;

Cursor (GAME_PARAMETAR_ID, NAME, VALUE, GAME_NAME_ID, GNAME, RNUM)              
------------------------------------------------------------------------
5, MAX_WIN, 100, 15, Royal , 1                                        
6, MAX_GAMBLE, 100, 15, Royal , 2                                     
8, MAX_BET, 50, 15, Royal , 3                                         
11, MIN_BET, 10, 15, Royal, 4   

我将如何比较第三行,仅一个参数(例如VALUE50)与其他参数,或者仅选择特定的行列?

我不确定是否有办法在纯SQL中这样做,而不更改函数定义。 如果您使用了表函数而不是返回游标,事情就会简单一些

下面是如何在PL/SQL中实现这一点

DECLARE
     v_game_parametar_id   INTEGER;
     v_name      VARCHAR2(20);
-- define all local variables to hold the cursor data
     v_cur             SYS_REFCURSOR := aff_setings.v$list_game_parameters_for_aff(4355,15,0,20); 
--load the cursor into a local refcursor
BEGIN
     LOOP
          FETCH v_cur INTO
               v_game_parametar_id,
               v_name;
               -- other variables
          EXIT WHEN v_cur%notfound;
          IF v_value = 50
          THEN
            do_the_comparision;
          END IF;
     END LOOP;
END;
/

如果您的结果是这样的:

“1、2、3、4、测试等”如第1行所示 “1、2、3、4、测试等”如第2行所示

然后您可以使用下面的查询

这就是如何使用正则表达式通过逗号分割数据并提取第三个值“[^,]+”,1,3如果需要第四个值,可以将其替换为“[^,]+”,1,4

以下是将结果与其他值进行比较的方法:

如果结果以光标的形式返回到一行中,则可以通过以下方式提取所需的值:

在本例中,id和名称是两列,共4行。如果要提取第三行第二列:

WITH test_data (raw_text)
 AS 
  (SELECT '{<ID=1,NAME=test4>,<ID=2,NAME=test3>,<ID=3,NAME=test5>,<ID=4,NAME=test1>,}' from dual
  )
SELECT  
regexp_substr(regexp_substr(regexp_substr(raw_text, '\{([^}]+)\}', 1,1,NULL,1), '\<([^>]+)\>', 1,3,NULL,1),'[^,]+', 1, 2)
FROM test_data
;

返回的结果是单独的行和列,还是包含多行的组合列?如果返回的输出是在一行中,且所有值组合为一个字符串,您可能需要使用正则表达式以逗号分隔数据,然后您可以单独分隔和比较返回的1行数据。请检查我的答案,如果它对您有帮助,请接受,或者为给定的解决方案提供相关反馈意见。请阅读:stackoverflow.com/help/someone-answers以了解它的重要性。但是,如果当我把它全部放在一行中时,将只计算到我需要的值,而不是在您的示例中的3或4,该怎么办?我添加了从单行数据中提取所需数据的代码。如您所说,共享准确的输出单行,以便我可以通过进一步更改来帮助您。希望这有帮助
select 
case when 
(select REGEXP_SUBSTR(aff_setings.v$list_game_parameters_for_aff(4355,15,0,20), '[^,]+', 1, 3)  from dual)
=50 then 1 else 0 end
from dual;
WITH test_data (raw_text)
 AS 
  (SELECT '{<ID=1,NAME=test4>,<ID=2,NAME=test3>,<ID=3,NAME=test5>,<ID=4,NAME=test1>,}' from dual
  )
SELECT  
regexp_substr(regexp_substr(regexp_substr(raw_text, '\{([^}]+)\}', 1,1,NULL,1), '\<([^>]+)\>', 1,3,NULL,1),'[^,]+', 1, 2)
FROM test_data
;