我有一个动态确定的逗号分隔的 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 子句中使用?
不确定 MySQL,但对于 Oracle,您可以使用正则表达式检查而不是 IN 子句,并对边界情况进行一些处理
If REGEXP_LIKE(cHighRank, "rank" + ",") or REGEXP_LIKE(cHighRank, "," + "rank") or REGEXP_LIKE(cHighRank, "(" + "rank" + ")")
MySQL 也应该可以,只是我没有在那里使用正则表达式
检查“项目”是否在逗号分隔列表中的一种方法是使用 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;
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
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;