Sql 根据变量已知值选择记录

Sql 根据变量已知值选择记录,sql,oracle,Sql,Oracle,我需要根据已知值选择一系列记录。记录ID遵循一种层次结构,其中前4个字符是常量(IA09),后面是表示组织的4位数字,后面是表示父组织内实体的4个字符。目标是选择已知值的所有“子”记录以及“已知值”记录 样本数据集: IA0900000000 IA0912340000 IA0912340109 IA0912340418 IA0912340801 IA0945810000 IA0945810215 IA0945810427 IA0945810454 这是相同的数据集,缩进以说明层次结构 IA09

我需要根据已知值选择一系列记录。记录ID遵循一种层次结构,其中前4个字符是常量(IA09),后面是表示组织的4位数字,后面是表示父组织内实体的4个字符。目标是选择已知值的所有“子”记录以及“已知值”记录

样本数据集:

IA0900000000
IA0912340000
IA0912340109
IA0912340418
IA0912340801
IA0945810000
IA0945810215
IA0945810427
IA0945810454
这是相同的数据集,缩进以说明层次结构

IA0900000000
  IA0912340000
    IA0912340109
    IA0912340418
    IA0912340801
  IA0945810000
    IA0945810215
    IA0945810427
    IA0945810454
示例1
如果已知值为“IA0900000000”,我需要选择数据集中的所有记录

例2
如果已知值为“IA0945810000”,我需要选择以“IA094581”开头的所有记录

例3
如果已知值为“IA0912340109”,我只需要选择具有该ID的记录,因为它没有子记录

实际的数据集比这个示例要大得多,并且数据库的每个用户的已知值都不同


我可以在WHERE子句中使用一个简单的比较来提供正确的记录子集吗?

假设您的表名为
YourTable
,列名为
column
。您可以从搜索词中删除尾随的0,并使用通配符(
%
)将其连接起来,然后像这样使用
LIKE
运算符:

SELECT * 
FROM YourTable 
WHERE column LIKE TRIM(TRAILING '0' FROM  'IA0945810000') || '%' 
您可以在案例中使用简单的“like”:

with t(org) as (-- test_data:
select 'IA0900000000' from dual union all
select 'IA0912340000' from dual union all
select 'IA0912340109' from dual union all
select 'IA0912340418' from dual union all
select 'IA0912340801' from dual union all
select 'IA0945810000' from dual union all
select 'IA0945810215' from dual union all
select 'IA0945810427' from dual union all
select 'IA0945810454' from dual 
)
select 
  regexp_replace(
     regexp_replace(
        regexp_replace(t.org,'0{4}')
       ,'0{4}')
    ,'(.{4})'
    ,'\1.'
  ) as short_org_path -- just for better readability
 ,t.* 
from t
where t.org like regexp_replace(regexp_replace('&input_org','0{4}'),'0{4}')||'%'
/

啊。。。这是一个巧妙的把戏!我喜欢这样!:-)非常感谢。我认为最好按4分组,因为如果
ia100000000 ia1012340000ia1100000000ia1112340109
感谢您推荐此方法,否则您可能会遇到问题。谢谢!:)