表T1:
ID C1 C2 C3 (实际上C1-C10 10个字段)
1 A B C
2 A B
3 B A
4 A
给定N个不定长字符(N<=3), 例(’A’, ‘B’),要求取出表T1中
有且只有(’A’,’B’)的纪录结果为:
2 A B
3 B A
ID C1 C2 C3 (实际上C1-C10 10个字段)
1 A B C
2 A B
3 B A
4 A
给定N个不定长字符(N<=3), 例(’A’, ‘B’),要求取出表T1中
有且只有(’A’,’B’)的纪录结果为:
2 A B
3 B A
tt.c1 C1,
tt.c2 C2,
.....
tt.c10 C10
from
(
select
a.*,
a.C1||a.C2||a.C3||a.C4.....||a.C10 str --把十个字段连起来
from
tablea a
) tt
where
tt.str in ('AB','BA')
就是用substr把你的字符串分解开,再排列组合起来放在in子句里就可以了。
下面是字符串中只有两个的情况,三个的你自已补全。select * from t3 where c1||c2||c3 in (substr('AB',1,1),substr('AB',2,1),substr('AB',3,1),
substr('AB',1,1)||substr('AB',2,1),substr('AB',2,1)||substr('AB',1,1),
substr('AB',2,1)||substr('AB',3,1),substr('AB',3,1)||substr('AB',2,1),
substr('AB',1,1)||substr('AB',3,1),substr('AB',3,1)||substr('AB',1,1));
ID
C1,
C2,
.....
C10
FROM T1
WHERE
C1||C2||C3||C4||.....||C10 IN ('AB','BA')
;
如果发现这个查询比较慢
可以在t1上建一个函数索引:
CREATE INDEX INDEX_T1 ON T1(
C1||C2||C3||C4||.....||C10 ASC
);
唉。
1.不管你的程序有几个参数传进来,
----给定N个不定长字符(N<=3), 例(’A’, ‘B’),
我现在假设他们为,(’A’, ‘AB’`,‘BA’),这样,可以替你否定上面的那些人的做法。同时,我选定了一个你的数据库里面不会有的一个字符。
我用了"*",你可以用其他的。select * from T1
where length('*' || c1 || '*' || c2 || '*' || c3 || '*' || c4 || '*' || c5 || '*' || c6 || '*' || c7 || '*' || c8 || '*' || c9 || '*' || c10 || '*')=length(P1 || P2 || P3) + 11
and instr('*' || c1 || '*' || c2 || '*' || c3 || '*' || c4 || '*' || c5 || '*' || c6 || '*' || c7 || '*' || c8 || '*' || c9 || '*' || c10 || '*', '*' || P1 || '*') > 0
and instr('*' || c1 || '*' || c2 || '*' || c3 || '*' || c4 || '*' || c5 || '*' || c6 || '*' || c7 || '*' || c8 || '*' || c9 || '*' || c10 || '*', '*' || P2 || '*') > 0
and instr('*' || c1 || '*' || c2 || '*' || c3 || '*' || c4 || '*' || c5 || '*' || c6 || '*' || c7 || '*' || c8 || '*' || c9 || '*' || c10 || '*', '*' || P3 || '*') > 0
多谢!