Sql 如何比较返回游标的函数中的行
我有一个函数,它返回游标并返回4行,其中包含IDnumber、namevarchar、valuenumber、GAME_NAME_IDnumber、GNAMEvarchar、RNUMnumber 现在我必须将这个函数的第三行与其他一些参数进行比较 这是函数和输出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
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
;