2013-05-14 30 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

相關問題