INSTRまたはCHARINDEXのためのプラットフォームニュートラルSQLステートメント
-
23-08-2019 - |
質問
私はOracleとMS SQLサーバの両方にSQL文を書く問題を抱えています。私はそれが両方で動作するようにSQLを書きたいと思います。私は、データベースの型変数を設定し、切り替えて周りの混乱に持っている必要はありません。
私はこのような値を持つコースの名前の欄があります:
9RA923.2008W
1223.200710
P0033330.200901
私は、右のすべてのものを選択したい ""。
Oracleでは、私はこれを使用しています:
SELECT substr(bom_course_id, instr(bom_course_id, '.')+1) FROM ...
MSSQLサーバーでは、私はこれを使用することができます
SELECT SUBSTRING(bom_course_id, CHARINDEX('.', bom_course_id)+1 ) FROM ...
誰がOracleまたはMS SQLのいずれかで同じSQL文を使用して、私はドットの後に最後の文字を選択することができ巧妙な方法を持っています。
残念ながら、私は前または後にあるだろうどのように多くの文字を知ることができません「」 それは私が数字だけを頼りにすることはできません、どちらか完全に数値ではありません。
私は本当にSQL標準があったことを望む。
解決
このリンクのを見て、私はあなたが何をしたい達成するための標準的な方法が表示されません。
ORACLE uses: INSTR
SQL SERVER uses: PATINDEX, CHARINDEX
ORACLE uses: SUBSTR
SQL SERVER uses: SUBSTRING
私は文字位置を取得する一般的な方法を考えることができませんでした。
A VIEW のでしょう続行する、またはクライアントアプリケーションの自身の中に<全角>それを行うには最も簡単な方法です。
他のヒント
あなただけのデータベースビューで選択を隠すと考えていますか? アプリケーションの観点からは、それは単なる、バニラは無い機能で選択され、すべてのデータベース固有のものがデータベースに残ります。
誰もが、そのアイデアに合っていない可能性があります。
あなたは数値にキャストしてからちょうど小数部分を取ることができますか?
あなたの地域設定は、両方のデータベースで同じである場合は、あなたが使用することができます。
SELECT DISTINCT CAST(CAST(bom_course_id AS FLOAT) AS INTEGER)
あなたは、SQL Serverのいずれかのように同じをしているOracleの機能という名前のRIGHTを書いて、あなたのSQLでそれを使用することができます。
<のhref = "http://www.planet-source-code.com/URLSEO/vb/scripts/ShowCode!asp/txtCodeId!1184/lngWid!5/anyname.htm" のrel = "nofollowをnoreferrer" >ここでの実装の一例であります。
EDIT:あなたのコメントを読んだ後、RIGHT関数は、あなたの状況では本当に便利ではないでしょう。その後、Oracleによると、SQL Serverの機能をマップする必要があります。