1

10gの式の結果に基づいて派生列を作成する方法はありますか?

具体的には、varchar2フィールド内に文字データと数値データの両方を含むテーブルを継承しました。明らかに、Oracleがフィールドでto_number()を使用するクエリを並べ替えると、常に「無効な数値」エラーが発生するため、結合を実行しようとしても頭痛の種は終わりません。したがって、私がやりたいのは、元の列の値が数値の場合は値を持ち、そうでない場合はNULLを持つ派生列を作成し、それを混合型のフィールドではなく結合で使用することです。

プロシージャ/関数ではなく、クエリでこれを実行しようとしていることに注意してください。

そのようなことは可能ですか?

4

3 に答える 3

3

Oracle 11gでは、仮想列を定義できます。

ALTER TABLE mytable ADD (new_column GENERATED ALWAYS AS (CASE WHEN id ...));

10g以前では、ビューの使用をお勧めします。

CREATE VIEW myview AS SELECT t.*, CASE WHEN ... END id_number FROM mytable;

パフォーマンスのために関数ベースのインデックスを使用して式にインデックスを付けることもできます(SQL標準関数と決定論的カスタム関数のみを使用する場合)。

CREATE INDEX idx ON mytable (CASE WHEN ...);
于 2012-07-10T15:37:30.057 に答える
2

10gで最も近いものは、関数ベースのインデックスです。何かのようなもの

CREATE OR REPLACE FUNCTION my_to_number( p_str IN VARCHAR2 )
  RETURN NUMBER
  DETERMINISTIC
IS
  l_num NUMBER;
BEGIN
  l_num := to_number( p_str );
  RETURN l_num;
EXCEPTION
  WHEN OTHERS THEN
    RETURN NULL;
END;

CREATE INDEX idx_derived_column
    ON table_name( my_to_number( column_name ) );

これには通常、クエリで関数を作成して参照する必要がありますが、関数ベースのインデックスは結果を事前に計算するため、実行時に実際に関数を呼び出すことはありません。この関数を本当に避けたい場合は、ステートメントにインデックスを作成してから、クエリCASEで同じCASEステートメントを参照することもできますが、状況が複雑になり、単純になるわけではありません。

于 2012-07-10T15:37:24.103 に答える
1

正規表現を使用できます:

select * from table where varchar_field not like '%[0-9]%';
于 2012-07-10T15:32:25.013 に答える