转换逗号分隔的 VARCHAR 以用于 PL/SQL 中的 IN 子句?

问题描述 投票:0回答:4

我有一个动态确定的逗号分隔的 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 等。但我不知道有多少,因为它是动态的。

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

如何转换逗号分隔的 VARCHAR 以在 IN 子句中使用?

oracle plsql plsqldeveloper
4个回答
1
投票

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

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

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


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;

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

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;
© www.soinside.com 2019 - 2024. All rights reserved.