Sql 类似oracle的语句转换?

Sql 类似oracle的语句转换?,sql,oracle,Sql,Oracle,我有一个我正在尝试运行的查询,而不是多次输入这个字符串。有什么方法可以让我把数字倒进去吗 select * from program_errors where program_programs like '%program' or key111 like '%No -> 49391250' and key111 like '%No -> 50130037' and key111 like '%No -> 50804475' and key111 like '%No ->

我有一个我正在尝试运行的查询,而不是多次输入这个字符串。有什么方法可以让我把数字倒进去吗

select *
from program_errors
where program_programs like '%program' 
or key111 like '%No -> 49391250'
and key111 like '%No -> 50130037'
and key111 like '%No -> 50804475'
and key111 like '%No -> 51003148'
and key111 like '%No -> 51053053'
;

我想做的就是将你在“字符串”集合中看到的数字插入到“in”子句或“HAVING”子句中,然后它返回数据。上面的陈述对我的程序有效,但我想知道是否有人知道一种更有效的方法。有没有办法将key111更改为int

如果您知道每行数字为8位,则可以执行以下操作:

select *
from program_errors
where program_programs like '%program' 
and substr(key111,-8) in (49391250,50130037,.....);

如果您的数字长度未知,但始终遵循“否”->,则可以使用REGEXP\u SUBSTR:

挑选* 从程序错误 其中程序\u像“%program”这样的程序 以及4939125050130037中的regexp_substrkey111,'No->[0-9]*',1,1,1

需要oracle 11g或更高版本。有关参数的含义,请参见doco

如果只是搜索几个值,您可以创建一个CTE:

with keys as (
  select '49391250' as key from dual
  union all select '50130037' from dual
  union all select '50804475' from dual
  union all select '51003148' from dual
  union all select '51053053' from dual
)
select p.*
from program_errors p
where p.program_programs like '%program'
union
select p.*
from program_errors p
join keys on p.key111 like '%No -> ' || keys.key;

我们在这里通常使用的另一种方法是使用excel公式生成重复的sql部分:

Column A                  Column B    Column C   Column D
    Key111 like '%No ->   49391250    '          A1&B1&C1
and key111 like '%No ->   50130037    '          A2&B2&C2
and key111 like '%No ->   50804475    '          A3&B3&C3
and key111 like '%No ->   51003148    '          A4&B4&C4
and key111 like '%No ->   51053053    '          A5&B5&C5

您只需将所有号码粘贴到B列中,并使用它生成剩余的号码。

看一看您正在使用和限制结果-这怎么可能起作用,不同的模式不能同时匹配?是的,如果值的构造是一致的,您可以将key111内容的子字符串转换为数字,但它将不可索引。您向我展示的oracle文档是一个很好的发现!我也不得不改成“或”。我搞砸了是的,你应该可以编写一个正则表达式来匹配%No->[0-9]{8}例如,类似这样的东西很高兴知道: