3

こんにちはみんな私は少し困惑している小さな苦境を持っています. 次のようなテーブルがあります(これは実際のテーブルのサンプルです。元のテーブルには機密データが含まれているため、これを使用して説明します。)

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"   

org の 2 桁目が「6」であり、「67130」のようなものを探しているため、期待される結果から除外されます

4

3 に答える 3

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でテスト済み

于 2013-05-14T16:52:16.870 に答える
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]$') 
;

私の正規表現は、各フィールドの合計文字数を制御します: 6 infund5 in org.

これがSQL Fiddleです。

于 2013-05-14T16:52:41.613 に答える
0

これはうまくいくかもしれません

test01 t から * を選択   
    where ((t.fund like ('1%') または t.fund like ('X%'))   
    および (t.org like ('6%') または t.org like ('X%'))   
    そして t.org は好きではありません('%6%')   
于 2013-05-14T16:47:18.923 に答える