0

ZH通常、2 つのアルファベット文字 ( 、、、、 ... など)SZを保持する Varchar2 フィールドがありAIます。それをFOOと呼びましょう。

A特定のデータセットはor A1-A9を同じフィールドに保存します。正確にそれらを除くすべての行を選択する必要があります。関数を使用して、数値Asubstrから分離しました。これまでのところ、うまくいっているか、 「number-string」で正しく動作していないようです。<>

数値に変換せずにこれを達成するにはどうすればよいですか? もっと簡単な解決策はありますか?

インターネットで何も見つけられなかったので、自分で試してみると限界に達しました。

これまでのところ、これは私のWHERE 句です。

WHERE (substr(FOO, 0, 1) != 'A'
 or (substr(FOO, 0, 1) = 'A' AND substr(FOO, 1, 1) > '9'));

制限なしですべての行を返します。

私が見つけた唯一の解決策:

WHERE (FOO NOT IN ('A', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9'));

A1しかし、将来どこかで-が発生する場合、これは最適ではありませんA50WHERE 句に 51 個の文字列を追加する必要があります。また、クエリがソースコードであるため、コードの可読性も低下します。

このソリューションは、ORACLESQL Server で動作するはずです。前もって感謝します

4

2 に答える 2

2

(substr(FOO, 0, 1) = (substr(FOO, 1, 1)- Oracle は 1 から始まります (0 ではありません)。

したがってsubstr(FOO, 2, 1)、2 番目のシンボルを取得するために使用する必要があります。

ただし、SUBSTRING (SUBSTR ではない) を持つ SQL Server では機能しません。

異なる DB で異なるアプローチを使用する準備ができている場合は、正規表現を試すこともできます。

オラクル

where not regexp_like(foo, '^A[1-9]{1,3}$')

^ 文字列の先頭
$ 文字列の末尾
[1-9] 1 から 9 までの任意の数字
{1,3} 前の式を 1、2 または 3 回繰り返す

一致する/一致しない FOO の例'^A[1-9]{1,3}$' a123-- 一致する場合もあれば、一致しない場合もある (大文字と小文字の区別に関する NLS 設定による)
A123-- 一致する (最初の記号は「A」、その他は 3 桁)
A123b-- 一致しない (最後の記号は数字である必要があります)
A1234-- 一致しません (最後に 1、2、または 3 桁の数字が必要です)
A12-- 一致
A1-- 一致

SQL Server T-SQL での SQL Server
REGEXP_LIKE 変換

于 2014-11-27T10:56:09.503 に答える