2009-09-12 12 views
2

私は、varcharフィールドを持つ数百万行のテーブルを持っています。 varcharの行の一部は浮動小数点数です。どの行が数字であり、どれがそうでないかを完全に分離できる他のフィールドには制約がありません。私は、(非数値を無視して)varcharフィールドの数値で行のORDER BYを使ってクエリを作成したいと考えています。私は単純にMyField :: numericを呼び出すことはできません。なぜなら、非数値の行を呼び出すためです。Postgres文字列を数値に変換する

私は2つの基本的なオプションを考えました:
(a)行が数値かどうかを判断するには、正規表現を使用してください。
(b)キャスト例外をキャッチし、すべての非数値値に対してnullを戻します。

速度が重要です。私はオプション(a)を試したが、それは痛いほど遅い。私は正規表現を使用してキャストする前に値をチェックするストアドプロシージャを作成しました。非数値はnullとして返されます。そのストアドプロシージャを使用してインデックスを作成しました。正規表現は非常に高価です。しかし、私は例外をキャッチしても努力する価値があるのだろうかと思います。

MyField :: numericに非数値データに対してnullを返す簡単な方法はありますか?これをより速く実行するための提案はありますか?

おかげ

答えて

1

は、スキーマが固定されている、またはあなたがそれを変更することができますか?特に浮動小数点値があれば、それを格納する別の(NULL可能な)列を追加できますか?挿入/更新のトリガによって、数値列が常に正しい値を持つことが確認できます。これは、あなたが挿入/更新するよりも頻繁に問い合わせることを前提としています。

+0

ええ、私はそれについて考えました。それはヌルのための多くの無駄なスペースですか?また、私は、トリガー上に配置されるOneToOne関係を持つテーブルを考えていました。値が決して数値にならないようにするために、他のフィールドで使用できる基準があります。 – User1

+0

私はPostgresがnullをどのように格納しているのか分かりません...正確なテーブル構造や実験だけで読んでみるべきでしょう。 –

+0

数値データ型を格納しているようです。私はそれが余分なストレージの価値があると思う。部分インデックスが最も多い私の質問は7分から20秒になりました。 – User1

1

速度を上げるため、トリガーによって更新される数値型の別の列を保持するという解決策を考えます。ヌルはスペースを無駄にしません。それ以外の場合は、ストアドプロシージャ(またはcase式で十分でなければなりません)を使用して値をチェックし、正しくキャストするソリューションが必要です。例外をキャッチすることは、おそらくそれらの中で最も高価な解決策になるでしょう。

関連する問題