2

我有一个逗号分隔的 varchar,它将动态确定。例如:

varchar cHighRank := (1,2,3,4,5,6,7,8)

我想在下面的 IN 子句中使用它,但系统会产生错误,因为 IN 子句仅适用于整数,例如:

if (rank in cHighRank) then
    --do the high rank...
elsif (rank in cLowRank) then
    -- do the low rank
end if; 

这个问题的基础是我必须将整数列表分成两半。它可能是 16、12 等。关键是我不知道它是动态的。例子:

16:低位:1,2,3,4,5,6,7,8 高位:9,10,11,12,13,14,15,16

我可以将我的动态值列表创建为 varchar,但它在 IN 子句中不起作用。

请帮忙。

谢谢,

4

4 回答 4

1

不确定 MySQL,但使用 Oracle,您可以使用正则表达式检查而不是 IN 子句,并在边界情况下进行一些工作

If REGEXP_LIKE(cHighRank, "rank" + ",") or REGEXP_LIKE(cHighRank, "," + "rank") or REGEXP_LIKE(cHighRank, "(" + "rank" + ")")

MySQL也应该可以,只是我没有在那里使用正则表达式

于 2013-09-10T19:08:22.140 回答
1
declare
  v_ranks constant varchar2(32767):= '1,2,3,4,5,6,7,8,9,10,11';
  -- number of ranks is number of commas + 1
  v_number_of_ranks constant number := regexp_count(v_ranks, ',') + 1;
  -- find the middle point
  -- you definition how to split odd number of ranks to hi/low might differ
  v_pos constant number := instr(v_ranks, ',', 1, v_number_of_ranks / 2);
begin
  -- split around the middle point
  dbms_output.put_line(' lowrank: ' || substr(v_ranks, 0, v_pos));
  dbms_output.put_line('highrank: ' || substr(v_ranks, v_pos + 1));
end;
/

输出:

 lowrank: 1,2,3,4,5,6,
highrank: 7,8,9,10,11
于 2013-09-11T05:42:43.137 回答
1
DECLARE
    Lowrank  VARCHAR2(30) := '1,2,3,4,5,6,7,8';
    HighRank VARCHAR2(30) := '9,10,11,12,13,14,15,16';
    rank     VARCHAR2(30) := '16';
BEGIN
    IF REPLACE(REGEXP_INSTR(Lowrank, ',{0,1}' || rank || ',{0,1}'), ',') > 0 THEN
        DBMS_OUTPUT.PUT_LINE('Lowrank');
    ELSIF REPLACE(REGEXP_INSTR(HighRank, ',{0,1}' || rank || ',{0,1}'), ',') > 0 THEN
        DBMS_OUTPUT.PUT_LINE('HighRank');
    END IF;
END;
于 2013-09-11T08:59:19.357 回答
1

检查“项目”是否在逗号分隔列表中的一种方法是使用 INSTR 函数。

假设您在列表中没有任何额外的空格,一个技巧是添加一个前导和尾随逗号,例如

',1,2,3,'

然后搜索给定的元素,例如',2,'

DECLARE 
   cHighRank VARCHAR2(100) := '1,2,3,4,5,6,7,8';

BEGIN
  IF INSTR( ','||cHighRank||',' , ','||rank||',' ) > 0 THEN
     -- matched
  END IF;
于 2013-09-10T19:17:31.843 回答