如果实现在IN子句中使用模糊查询??

jingruifeng 2008-08-29 03:53:27
例如这样的语句:
select * from tableName A where A.code like '101%' or A.code like '102%'
想把它写成IN子句的,比如这样:
select * from tableName A where A.code In ('101%','102%')
当然上面这样写法是不正确的,但是就是这个意思,有哪位大侠帮忙给个正确的写法?小弟先谢过了...
...全文
2968 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
diliugan100 2008-08-31
  • 打赏
  • 举报
回复
你可以把他写成一个函数啊,然后用动态SQL实现啊
Execute Immediate ' select * from tableName A where ' || f_GetCondition(pi_sColName,pi_ConValue);
在f_GetCondition 里面用循环来时条件的组装
[Quote=引用楼主 jingruifeng 的帖子:]
例如这样的语句:
select * from tableName A where A.code like '101%' or A.code like '102%'
想把它写成IN子句的,比如这样:
select * from tableName A where A.code In ('101%','102%')
当然上面这样写法是不正确的,但是就是这个意思,有哪位大侠帮忙给个正确的写法?小弟先谢过了...
[/Quote]
佳岳 2008-08-30
  • 打赏
  • 举报
回复
我以为是考试题目 ,如果是实际的应用 就不一定要用IN 的吧 ,能简单快速解决问题不就可以了 吗
oracledbalgtu 2008-08-29
  • 打赏
  • 举报
回复
如果规则不确定,like or是最简单的 ,不要舍进求远。


[Quote=引用 18 楼 jingruifeng 的回复:]
有点离题太远了,不能这么复杂的实现啊.太复杂的话就背离了我的本意了,那我还不如LIKE OR 了
[/Quote]
jingruifeng 2008-08-29
  • 打赏
  • 举报
回复
有点离题太远了,不能这么复杂的实现啊.太复杂的话就背离了我的本意了,那我还不如LIKE OR 了
佳岳 2008-08-29
  • 打赏
  • 举报
回复
建立一个临时表TABLE1 存放你的 LIKE 101% 102%的东东
create table table1
as
select a.code from tablename where acode like '101%' or A.code like '102%' ;
然后通过IN 语句来实现
select * from tablename a where a.code in (select to_char(a.code) from table1)
kinlin 2008-08-29
  • 打赏
  • 举报
回复
create or replace type str_tb is table of varchar2(32767)


select A.* from
tableName A,
(
select column_value as CODE from table(str_tb('101','102'))
) B
where A.CODE like B.CODE || '%'
jingruifeng 2008-08-29
  • 打赏
  • 举报
回复
兄台们开动你们聪明的脑袋,再想想,再想想~~~
jingruifeng 2008-08-29
  • 打赏
  • 举报
回复
SQL还是不够强大啊.需求总是无止境的,哈哈
hebo2005 2008-08-29
  • 打赏
  • 举报
回复
不过上面的这段有个缺点

instr 相当于 like '%101%'
和'101%'还有差别的
或者用
substr(a.code,1,length(b.in_str))=b.in_str
这样就是开头匹配的
jingruifeng 2008-08-29
  • 打赏
  • 举报
回复
晕了,回10楼,这个方法不太可行,哈哈.不过也谢谢你,再想想别的办法~~~
雨男 2008-08-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jingruifeng 的回复:]
引用 4 楼 hebo2005 的回复:
有种办法,把你IN的字符串生成一个结果集,然后用instr来实现


你说的这个做法能说的详细一些吗?谢谢
[/Quote]

我想hebo2005的意思是将所有的条件做成一个结果集,相当于一个子查询,然后将其和要查询的表进行关联。
而在利用INSTR(A.code,结果集.XXX)> 0来过滤数据。
hebo2005 2008-08-29
  • 打赏
  • 举报
回复
select a.*
from tableName A ,(

SELECT DECODE (INSTR (:in_str, ',', 1, 1),
0, :in_str,
SUBSTR (:in_str,
DECODE (ROWNUM,
1, 1,
INSTR (:in_str,
',',
1,
ROWNUM - 1
)
+ 1
),
DECODE (ROWNUM,
1, INSTR (:in_str, ',', 1, 1) - 1,
LENGTH (:in_str)
- LENGTH (REPLACE (:in_str,
',',
''
)
)
+ 1, LENGTH (:in_str),
INSTR (:in_str, ',', 1, ROWNUM)
- 1
- INSTR (:in_str,
',',
1,
ROWNUM - 1
)
)
)
) in_str
FROM DUAL
CONNECT BY ROWNUM <=
LENGTH (:in_str)
- LENGTH (REPLACE (:in_str, ',', ''))
+ 1) b
where instr(a.code,b.in_str,1)>0


你把这段SQL去试试
其中的
:in_str 用'101,102'代替,不用加%
jingruifeng 2008-08-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hebo2005 的回复:]
有种办法,把你IN的字符串生成一个结果集,然后用instr来实现
[/Quote]

你说的这个做法能说的详细一些吗?谢谢
雨男 2008-08-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 miaolei193 的回复:]
SELECT
*
FROM
tableName
WHERE
SUBSTR(A.code, 1, 3) IN ('101', '102')
这个方法是可以的,意思是从字符串的第一个位置截取字符,取三个字符,跟字符长短没有什么关系

[/Quote]

固定截取头3位,而IN子句的条件中有4位的条件,那么4位的条件永远不会被匹配上,所以不能满足要求。
jingruifeng 2008-08-29
  • 打赏
  • 举报
回复
佛瑞偶一:
你说的这个不行的.比如就取前三位来说,我可能条件是101,102,1001,如果按照这个做法,语句应该是
SELECT
*
FROM
tableName
WHERE
SUBSTR(A.code, 1, 3) IN ('101', '102','100')喽,但是这样就有可能把前4位是1002的记录也带出来了,所以说不太可行哦.
hebo2005 2008-08-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 miaolei193 的回复:]
SELECT
*
FROM
tableName
WHERE
SUBSTR(A.code, 1, 3) IN ('101', '102')
这个方法是可以的,意思是从字符串的第一个位置截取字符,取三个字符,跟字符长短没有什么关系
[/Quote]
楼主要如果是in('101','102','1001')
你有个数据是111002
明显不符合要求的
但用你的SUBSTR就会符合要求了
雨男 2008-08-29
  • 打赏
  • 举报
回复
如果你的条件完全没有规律,那么就不能实现吧。
如果有一定规律,也可以利用正则表达式解决。
hebo2005 2008-08-29
  • 打赏
  • 举报
回复
有种办法,把你IN的字符串生成一个结果集,然后用instr来实现
miaolei193 2008-08-29
  • 打赏
  • 举报
回复
SELECT
*
FROM
tableName
WHERE
SUBSTR(A.code, 1, 3) IN ('101', '102')
这个方法是可以的,意思是从字符串的第一个位置截取字符,取三个字符,跟字符长短没有什么关系
jingruifeng 2008-08-29
  • 打赏
  • 举报
回复
three_stone_liu:

这个方法好像不太行啊.如果我的条件是101,102,1001怎么办啊?这个长度没办法确定的呀
加载更多回复(1)
【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进

17,380

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧