2013-05-14 85 views
3

你好家伙我有一个小的谓词让我有点难住。我有类似下面的表中。(这是我真正的表的样本。我用这个来解释,因为原来的表有敏感数据。)插入oracle sql在表中获得所有可能的组合

CREATE TABLE TEST01( 
TUID VARCHAR2(50), 
FUND VARCHAR2(50), 
ORG VARCHAR2(50)); 
Insert into TEST01 (TUID,FUND,ORG) values ('9102416AB','1XXXXX','6XXXXX'); 
Insert into TEST01 (TUID,FUND,ORG) values ('9102416CC','100000','67130'); 
Insert into TEST01 (TUID,FUND,ORG) values ('955542224','1500XX','67150'); 
Insert into TEST01 (TUID,FUND,ORG) values ('915522211','1000XX','67XXX'); 
Insert into TEST01 (TUID,FUND,ORG) values ('566653456','xxxxxx','xxxxx'); 
Insert into TEST01 (TUID,FUND,ORG) values ('9148859fff','1XXXXXX','X6XXX'); 

表数据后

"TUID"      "FUND"      "ORG"       
"9102416AB"     "1XXXXX"      "6XXXXX"      
"9102416CC"     "100000"      "67130"      
"955542224"     "1500XX"      "67150"      
"915522211"     "1000XX"      "67XXX"      
"566653456"     "xxxxxx"      "xxxxx"      
"9148859fff"     "1XXXXXX"      "X6XXX" 

在“X”的是通配符元素*(我继承了这一点,我不能改变的表格式)*我想提出像下面

select tuid from test01 where fund= '100000' and org= '67130' 
然而

查询我真正想要做的是检索一个有ÿ记录有那些链段在其中包括“X的

in other words the expected output here would be 

"TUID"      "FUND"      "ORG"       
"9102416AB"     "1XXXXX"      "6XXXXX"      
"9102416CC"     "100000"      "67130"      
"915522211"     "1000XX"      "67XXX"      
"566653456"     "xxxxxx"      "xxxxx" 

我已经开始写,将有像12一样在其声明中大规模的SQL语句,因为我将要比较的组织和资助无微不至。 这就是我的领导。但我想知道是否有更好的方法。

select * from test02 
where fund = '100000' and org = '67130' 
or fund like '1%' and org like '6%' 
or fund like '1%' and org like '67%' 
or fund like '1%' and org like '671%' 
or fund like '1%' and org like '6713%' 
or fund like '1%' and org like '67130' 
or fund like '10%' and org like '6%'...etc 

/*seems like there should be a better way..*/ 

谁能给我一个手想出这条SQL语句...

的方式通知,

"9148859fff"     "1XXXXXX"      "X6XXX" 

与预期resul由于在第二位排除组织是“6”,即时寻找任何看起来像“67130”

+0

请注意:“1%的基金”和“6%的基金会”取代所有其他条件。 – 2013-05-14 16:27:27

+0

你可以有'X7130'吗?如果是的话,应该怎么办?或者'67X30'? – 2013-05-14 16:28:56

+0

@PM是的,你可以有“X7130”,在这种情况下,它需要包括在内,你也可以有67x30,它也需要包含在查询中,因为这种通配符像这样工作,“XXXXX”,“1XXXX “,”10XXXXX“,”100XXX“等,在字符之间不会有任何开放的空间,希望这是有意义的。 – Miguel 2013-05-14 16:38:01

回答

3

您可以使用REPLACE()功能用通配符_更换x然后用LIKE

SELECT * 
FROM test01 
WHERE '100000' LIKE REPLACE(REPLACE(fund, 'x', '_'), 'X', '_') 
    AND '67130' LIKE REPLACE(REPLACE(org, 'x', '_'), 'X', '_') ; 

测试在SQL-Fiddle

+0

谢谢你这是灵活适用和优雅。我很欣赏这种回应! – Miguel 2013-05-14 17:02:43

0

这可能会工作

 
Select * from test01 t 
    where ((t.fund like ('1%') or t.fund like ('X%')) 
    and (t.org like ('6%') or t.org like ('X%')) 
    and t.org not Like('%6%') 
+0

您的逻辑会在其他许多方面匹配(例如)'19999'和'650000'。 – 2013-05-14 16:55:17

+0

是的,我同意...正则表达式在这种情况下最好的工作 – newtooca 2013-05-14 16:58:03

2

假设你想同时匹配 “X” 和“x”:

SELECT * 
FROM Test01 t1 
WHERE REGEXP_LIKE(t1.fund, '^[Xx1][Xx0][Xx0][Xx0][Xx0][X0x]$') AND 
     REGEXP_LIKE(t1.org, '^[Xx6][Xx7][Xx1][Xx3][Xx0]$') 
; 

我的正则表达式控制每个字段中的字符的总数目:在fund和在org

这是SQL Fiddle

+0

这个工程,但我只限于“67130”我试图得到一个查询,我可以改变的价值观。然而非常酷的查询。 – Miguel 2013-05-14 17:01:37