2017-07-04 17 views
0

特定の値と数の見出しのそれぞれで、32列の表の行を検索したいと思いますが、oracleの列名をすべて入力しなくても行全体を問い合せることは可能ですか?ORACLEで特定の値を求める行を検索する

+0

ハズレのSQLクライアント上で実行することができます 。しかし、あなたはすべての列のリストを取得し、動的にクエリを作成することができます – are

+0

1列の場合でも、列名を使用せずに値を検索したいですか?あなたは何を探しているのですか? – user7294900

+0

悪いデータモデルのように聞こえます – APC

答えて

1

はい、可能ですが、解決策は高速ではなく、xqueryに関する基本知識が必要です。

create table test_objects as select * from user_objects where rownum < 100; 

select * from 
    xmltable('for $row in ora:view("test_objects")/ROW return count($row/*[contains(text(),$TO_SEARCH)])' passing 'N' as "TO_SEARCH" columns cnt number path '.'); 

クエリ値に "N" を含む列をカウントテストテーブルを作成。

あなたはビットに私たちは列がEMP表でテスト

select * from 
    xmltable('for $row in ora:view("test_objects")/ROW return <ROW><CNT>{count($row/*[contains(text(),$TO_SEARCH)])}</CNT><COLUMNS>{string-join($row/*[contains(text(),$TO_SEARCH)]/name(),", ")}</COLUMNS></ROW>' passing 'N' as "TO_SEARCH" 
    columns 
    cnt number path 'CNT' 
    , list_of_column varchar2(4000) path 'COLUMNS' 
    ); 
+0

これは私が得ようとしていたものです。 –

+0

非常にありがとうArkadiuszŁukasiewicz これは私が得ることを試みたものです。 そして私はxmltableとfamiljarではないので、 "AND USER_ID =(パラメータ)"または他のパラメータのような条件を追加したい場合は可能ですか? –

+0

はい、可能です。 XQuery言語や 'XQuery FLWOR'についてのチュートリアルがあります。 2番目のオプションは通常のSQLと非常によく似ています。 –

0
  1. 検索値を含めるかを確認することができ、クエリを変更した場合、(私は推測)のOracle DBのインストールで利用可能であるべきです。
  2. すべてのフィールドを検索するSQLテキストを作成します。
  3. USER_TAB_COLUMNSを試していない場合は、テーブルを所有している場合
  4. %のKING%は検索用語です、あなたはDBA_TAB_COLUMNSへのアクセス権を持っていると仮定します。
  5. SQL文字列の制限は4000文字です。あなたが別のスキーマにテーブルを持っている可能性があるため、これらのテーブルの
  6. OWNERは、異なる可能性が

以下はSQL Plusまたはお好み:)

VARIABLE cur REFCURSOR; 

DECLARE 
    v_chr VARCHAR2(4000); 
    v_chr_tablename VARCHAR2(30) := 'EMP'; 
    v_chr_searchterm VARCHAR2(100) := 'KING'; 
BEGIN 

    SELECT 'SELECT * FROM ' || v_chr_tablename || ' where ' 
     || RTRIM (XMLAGG (XMLELEMENT (E, 'TO_CHAR(' 
     ||column_name 
     || ')', ' || ').EXTRACT ('//text()') 
    ORDER BY column_name).getStringVal(), ' || ') 
     ||' like ''%' || v_chr_searchterm || '%''' 
    INTO v_chr 
    FROM DBA_TAB_COLUMNS 
    WHERE table_name = v_chr_tablename 
    AND owner  = 'APPS'; 

    OPEN :cur FOR v_chr; 

END; 
/
print cur; 
関連する問題