Sql 甲骨文“where子句”将变短

Sql 甲骨文“where子句”将变短,sql,oracle,Sql,Oracle,假设“table1”有三列: “钥匙”, “singleID”, “多重性” 行将类似于: 1,'8736', '1234;6754;9785;6749' 2,'7446', '9959;7758;6485;9264' 要搜索id位于“singleID”中或作为其一部分的所有行,请执行以下操作: “多个ID”中的连接ID我将: select key from table1 where singleID = '8888' or multipleIDs like '%8888%'; 当不

假设“table1”有三列:

“钥匙”, “singleID”, “多重性”

行将类似于:

1,'8736', '1234;6754;9785;6749' 
2,'7446', '9959;7758;6485;9264'
要搜索id位于“singleID”中或作为其一部分的所有行,请执行以下操作: “多个ID”中的连接ID我将:

select key from table1 where 
  singleID = '8888' or multipleIDs like '%8888%';
当不仅搜索本语句中的一个ID 8888,而且搜索100时,有必要使用不同的ID重复where子句100次,例如:

select key from table1 where 
  singleID = '8888' or multipleIDs like '%8888%' or
  singleID = '9999' or multipleIDs like '%9999%' or
....;
要搜索的ID是从另一个查询动态获取的,如

 select id from table2;
查询应 可以动态创建,因为ID的数量可能会有所不同。 像这样,SQL语句将变得相当长

在Oracle SQL中是否有一种简洁的表达方式?可能是PLSQL?

类似的东西

这是测试版本:

with sv_qry
as
(
SELECT trim(regexp_substr(search_values, '[^,]+', 1, LEVEL)) val
  FROM (select '1234,7446' as search_values
from dual
)
CONNECT BY LEVEL <= regexp_count(search_values, ',')+1
)
, table1_qry
as
(select 1 as id,'8736' as single_id, '1234;6754;9785;6749' as multiple_id from dual
union all
select 2,'7446' as single_id, '9959;7758;6485;9264' as multiple_id from dual
)
select *
from table1_qry
inner join
sv_qry
on  single_id = val or multiple_id like '%'||val||'%'
这将是一个名为table1的表格:

with sv_qry
as
(
SELECT trim(regexp_substr(search_values, '[^,]+', 1, LEVEL)) val
  FROM (select '1234,7446' as search_values
from dual
)
CONNECT BY LEVEL <= regexp_count(search_values, ',')+1
)
select *
from table1
inner join
sv_qry
on  single_id = val or multiple_id like '%'||val||'%'
部分信贷如下:

像这样的

这是测试版本:

with sv_qry
as
(
SELECT trim(regexp_substr(search_values, '[^,]+', 1, LEVEL)) val
  FROM (select '1234,7446' as search_values
from dual
)
CONNECT BY LEVEL <= regexp_count(search_values, ',')+1
)
, table1_qry
as
(select 1 as id,'8736' as single_id, '1234;6754;9785;6749' as multiple_id from dual
union all
select 2,'7446' as single_id, '9959;7758;6485;9264' as multiple_id from dual
)
select *
from table1_qry
inner join
sv_qry
on  single_id = val or multiple_id like '%'||val||'%'
这将是一个名为table1的表格:

with sv_qry
as
(
SELECT trim(regexp_substr(search_values, '[^,]+', 1, LEVEL)) val
  FROM (select '1234,7446' as search_values
from dual
)
CONNECT BY LEVEL <= regexp_count(search_values, ',')+1
)
select *
from table1
inner join
sv_qry
on  single_id = val or multiple_id like '%'||val||'%'
部分信贷如下:


您可以这样表示查询:

  select key
    from table1 a
    join ( select id from table2 where id in ('yyyy','xxxx','zzzz',...) b 
    on a.singleId = b.id or a.multipleID like '%'||b.id||'%';

您可以这样表示查询:

  select key
    from table1 a
    join ( select id from table2 where id in ('yyyy','xxxx','zzzz',...) b 
    on a.singleId = b.id or a.multipleID like '%'||b.id||'%';

将值存储为csv有时非常糟糕,因为我们不是生活在一个完美的世界中,我们必须处理遗留数据和遗留数据结构。@Spanky这绝对正确,但糟糕的设计仍然应该得到解决,以便其他可能是初学者的用户不会对数据库设计产生错误的想法。将值存储为csv是非常糟糕的数据库设计有时,因为我们生活在一个不完美的世界中,我们必须处理遗留数据和遗留数据结构。@Spanky这绝对正确,但糟糕的设计仍然应该得到解决,这样其他可能是初学者的用户就不会对db设计产生错误的想法。