我有一张表机构表(机构id,管理人员身份证号,用户数量),其中身份证号并不是单个省份证号码、而是加了密的一个字符串,通过某个算法可以得到多个真正的身份证号码数组,我的目的是将多个身份证号码与用户表进行关联得到多个记录,比如机构表一条记录为(0100,ssfsx0sesd00xsdf,30),‘ssfsx0sesd00xsdf’可以导出多个身份证号aaaa、bbb、ccc,则我想要的数据集合是
0100,aaa,30,
0100,bbb,30
0100,ccc,30
请问如何用sql语句表达出来?算法可以封装成函数.但必须用一个查询表达出来。

解决方案 »

  1.   

    ‘ssfsx0sesd00xsdf’这个字符串里面有规则吗?比如:每次导出的身份证号都是4个。彼此之间用什么分隔的。多提供一些信息。
      

  2.   

    运用在sql语句中的函数是有限制的,你这通过算法返回的是一个的集合,怎么可能在sql语句中存在。
    一条sql语句是不行的,要达到效果就要用函数或存储过程,然后返回复合类型集合。
      

  3.   

    SQL> select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    CORE 10.2.0.1.0 Production
    TNS for Linux: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
    SQL> create or replace type arr  is table of varchar2(100);
      2  /
     
    Type created
     
    SQL> 
    SQL> create or replace function f
      2  (
      3         p_str      in   varchar2
      4  )
      5  return arr
      6  is
      7         v_x arr;
      8  begin
      9         v_x := arr();
     10         v_x.extend();
     11         v_x(1) := '1234';
     12  
     13         if (to_number(p_str) > 5) then
     14  
     15             v_x.extend();
     16             v_x(2) := '8910';
     17  
     18         end if;
     19  
     20         return v_x;
     21         --....
     22  end;
     23  /
     
    Function created
     
    SQL> 
    SQL> with t as (
      2              select to_char(rownum) str
      3                from dual
      4              connect by rownum <= 10
      5            )
      6  select t.str, column_value
      7    from t, table(cast(f(t.str) as arr)) x
      8  /
     
    STR                                      COLUMN_VALUE
    ---------------------------------------- --------------------------------------------------------------------------------
    1                                        1234
    2                                        1234
    3                                        1234
    4                                        1234
    5                                        1234
    6                                        1234
    6                                        8910
    7                                        1234
    7                                        8910
    8                                        1234
    8                                        8910
    9                                        1234
    9                                        8910
    10                                       1234
    10                                       8910
     
    15 rows selected
      

  4.   

    这句:select t.str, column_value
         from t, table(cast(f(t.str) as arr)) x;我原以为是执行不过的,结果经测试,居然成功