Sql 甲骨文“where子句”将变短
假设“table1”有三列: “钥匙”, “singleID”, “多重性” 行将类似于: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%'; 当不
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设计产生错误的想法。