2

where句でREGEXP_LIKE関数を使用するSQLがありますが、Oracle8iで実行されるその関数と同等のものが必要です。

正規表現は次のようになります。

where REGEXP_LIKE(parm, '^[PMF][[:digit:]]+[_].*')

前もって感謝します。

4

3 に答える 3

6

あなたは試すことができます

WHERE SUBSTR(parm,1,1) IN ('P','M','F')
AND substr(parm,2,1) between '0' and '9'
AND substr(ltrim(substr(parm,2),'0123456789'),1,1) = '_'

最初の文字はP、M、またはFです。2番目の文字は数字です。2番目以降の文字は、左からすべての数字を取り除き、アンダースコアで始まる必要があります。

PS。8iデータベースを撮影してください。8iはサポートされていないだけでなく、9iと10gもサポートされていません(または、少なくとも「劣化しているため、使用を中止してください」レベルのサポートです)。

于 2011-05-11T04:32:46.043 に答える
3

ぐるぐる回ってみると、8iまで利用可能だったOWA_PATTERNというパッケージがあるようです。かなりの正規表現サポートを提供しました。これは明らかにPL/SQLWebToolkitのインストールの一部でした。8iインストールで使用できる場合とできない場合があります。データベースについてはDBAに確認してください。

これは、それを参照する9iドキュメントです。

于 2011-05-11T04:50:00.580 に答える
2

残念ながら、REGEXP_LIKEの前は、物事はかなり厳しいものでした。降り注ぐ雨の中、両方向とも手作業でこれをしなければなりませんでした。このようなものがおそらく必要です:

WHERE SUBSTR(parm,1,1) IN ('P','M','F')
AND digits_followed_by_underscore(SUBSTR(parm,2)) = 'Y'

次の手順を使用します(警告:急いで一緒にハッキングされ、テストされていません):

CREATE PROCEDURE digits_followed_by_underscore(v IN VARCHAR2)
  RETURN VARCHAR2 IS
  digit_found VARCHAR2(1) := 'N';
BEGIN
  IF LENGTH(v) = 0 THEN
    RETURN 'N';
  END IF;
  FOR i IN 1..LENGTH(v) LOOP
    IF SUBSTR(v,i,1) BETWEEN '0' AND '9' THEN
      digit_found := 'Y';
    ELSIF SUBSTR(v,i,1) = '_' THEN
      RETURN digit_found;
    ELSE
      RETURN 'N';
    END IF;
  END LOOP;
  RETURN 'N';
END;
于 2011-05-11T04:14:48.767 に答える