私は、varcharフィールドを持つ数百万行のテーブルを持っています。 varcharの行の一部は浮動小数点数です。どの行が数字であり、どれがそうでないかを完全に分離できる他のフィールドには制約がありません。私は、(非数値を無視して)varcharフィールドの数値で行のORDER BYを使ってクエリを作成したいと考えています。私は単純にMyField :: numericを呼び出すことはできません。なぜなら、非数値の行を呼び出すためです。Postgres文字列を数値に変換する
私は2つの基本的なオプションを考えました:
(a)行が数値かどうかを判断するには、正規表現を使用してください。
(b)キャスト例外をキャッチし、すべての非数値値に対してnullを戻します。
速度が重要です。私はオプション(a)を試したが、それは痛いほど遅い。私は正規表現を使用してキャストする前に値をチェックするストアドプロシージャを作成しました。非数値はnullとして返されます。そのストアドプロシージャを使用してインデックスを作成しました。正規表現は非常に高価です。しかし、私は例外をキャッチしても努力する価値があるのだろうかと思います。
MyField :: numericに非数値データに対してnullを返す簡単な方法はありますか?これをより速く実行するための提案はありますか?
おかげ
ええ、私はそれについて考えました。それはヌルのための多くの無駄なスペースですか?また、私は、トリガー上に配置されるOneToOne関係を持つテーブルを考えていました。値が決して数値にならないようにするために、他のフィールドで使用できる基準があります。 – User1
私はPostgresがnullをどのように格納しているのか分かりません...正確なテーブル構造や実験だけで読んでみるべきでしょう。 –
数値データ型を格納しているようです。私はそれが余分なストレージの価値があると思う。部分インデックスが最も多い私の質問は7分から20秒になりました。 – User1