8

私の質問は次のとおりです 。Oracle regexp_like は、1 または 0 または文字列と比較する必要なく、where 句で単独で機能します。この関数は、case ステートメントまたは where 句で何かを評価するときにのみ呼び出すことができます。説明できないので(データ辞書で検索してみました)、同じように機能する関数をどのように書くか疑問に思っています。

例えば:

function is_prod
returns boolean
is 
  l_var boolean := false;
begin
  if sys_context('userenv','db_unique_name') = '"PROD_SERVER"' then
    l_var := true;
  end if;
return l_var;
end;

この関数はコンパイルされますが、次のような SQL ステートメントでは使用できません。

select *
from table t
where is_prod

次のエラーが発生するため: ORA-00920: 関係演算子が無効です。

それを数値または真と比較しても機能しません。

regexp_like のコード ベースはどこにありますか、またはこれを regexp_like のように機能させるにはどうすればよいですか?

注: 数時間調べてみたところ、Oracle の正規表現関数は実際には Java 呼び出しであることがわかりましたが、これは、まだ pl/sql ラッパーが必要であることを意味します。

4

2 に答える 2

9

基本的に、オラクルにはPLSQL専用の boolean データ型があります。したがって、plsql にとどまっている限り、それらを使用できますが、SQL では使用できません。

ドキュメントから:

SQL には BOOLEAN に相当するデータ型がないため、次のことはできません。

  • BOOLEAN 値をデータベース テーブルの列に割り当てる

  • データベース テーブルの列の値を選択または取得して BOOLEAN 変数に入れる

  • SQL ステートメント、SQL 関数、または SQL ステートメントから呼び出される PL/SQL 関数で BOOLEAN 値を使用する

組み込み関数に関するメタデータを見つけたい場合は、この投稿が役立つかもしれません。

于 2012-06-14T15:39:34.683 に答える
-1

SQLはそのようには機能しません。where ステートメントは常に何かがある関数/列を探します。関数が機能したとしても、必要な値を True または False にする where ステートメントを指定する必要があります。

私はOracle SQLを使用していませんが、そこにあるものを見ると、このように書くと

  select *
  from table t
  where is_prod = True

関数の Variable 型を Varchar(5) などに変更すると機能します。

実際には、その関数に複数のレコードを調べるように要求しているため、このようにすると、where ステートメントのようではなく、Select ステートメントのように動作します。関数の値を提供しますが、場所をフィルタリングしません。trueまたはfalse値を持つ列のように見えます。

Where次のようなステートメントで関数を使用する場合:

SELECT *
FROM table t
WHERE is_Prod

それは次のように言っているようなものです:

SELECT *
FROM table t
WHERE Column1

WHEREあなたは声明のために明確にする必要があります

SELECT *
FROM table t
WHERE Column1 = 'blue' or is_Prod = 'false'

C# では、文字列をブール値として使用できます。null の場合は false を返します

SQL Serverでは、このようになります

Column2 IS NULL

まだオペレーターが必要です

*セパレーター*

私は Oracle を使用していないため、これをテストできませんでした。

http://docs.oracle.com/cd/B14117_01/server.101/b10759/conditions018.htm

REGEXP_LIKE は like ステートメントです。そのため、比較演算子を使用します。

おそらく、like ステートメントで正規表現を記述できますが、時間がかかり、単調であると確信しているため、それを行う関数を作成しました。

言い換えれば、作成した関数で「=whatever」を使用する必要があります。

于 2012-06-14T15:37:50.753 に答える