3

作成する必要のある新しいデータベーステーブルがあります...
論理的には、、、、およびが含まれIDています。 その値フィールドは、本質的に数値または文字列のいずれかです。 name"value"

フィールドをavarcharにするだけではなく、などのフィルターを使用してクエリを実行できるようにしたいのですWHERE value > 0.5

SQL Server 2005でこの概念をモデル化するための最良の方法は何ですか?

編集: ここで複数のフィールド(1つは数値用、もう1つは非数値用)を作成することに反対していませんが、それらはすべて実際には同じ概念であるため、それが素晴らしいアイデアかどうかはわかりませんでした。
別々のフィールドを作成して、それらを1つの論理列に合体させるビューを作成できると思います。

それについて何か意見はありますか?

私が達成したいことは本当に非常に単純です...通常、このデータはグリッドタイプのビューで盲目的に表示されます。
そのグリッドの数値もフィルタリングできるようにしたいと思います。このテーブルは最終的に数千万のレコードに含まれることになります。そのため、クエリのパフォーマンスで自分を追い詰めたくありません。
そのクエリのパフォーマンスが私の主な関心事です。

4

9 に答える 9

3

必要なクエリサポートを取得する良い方法は、2つの列を用意することです。数値を格納するnumvalueと文字を格納するtextvalueです。それらはnull許容であるか、少なくとも値がないことを表すデフォルトが必要です。次に、アプリケーションは、値を格納する列と値を残さない列を決定できます。

于 2008-08-29T14:58:00.517 に答える
2

データの混合に関する問題は、Sql 2005 がテキスト データをソートする方法にある可能性があります。それは「自然な」種類ではありません。

varchar フィールドがあり、次のようにする場合:

where value > '20.5'

「5」のような値が結果に含まれます (文字ベースのソートでは「5」が「20.5」の後に来る)

ストレージ用に個別の列を使用すると、より良い結果が得られます。

結果にマージする必要がある場合は、Coalesce を使用してそれらを 1 つの列にマージします。

select [ID], [Name], Coalesce( [value_str], [value_num] )
from [tablename]
于 2008-08-29T15:44:36.673 に答える
0

数値と文字列の値を同じ列に格納する場合、その列をクエリフィルタとして使用するときに、多くのキャストと変換を回避できるかどうかはわかりません。

于 2008-08-29T14:56:54.013 に答える
0

2列。

Table: (ValueLable as char(x), Value as numerica(p,s))
于 2008-08-29T14:58:17.347 に答える
0

varchar型とint型の両方を持つ列を持つことは不可能だと思います。値をvarcharとして保存し、クエリ中にintにキャストできます。ただし、この方法では、値に文字が含まれている場合に例外が発生する可能性があります。何を達成しようとしていますか?

于 2008-08-29T14:58:19.937 に答える
0

文字列を保持できるようにするには、列varcharなどを作成する必要があると思います。

別の方法として、1つの値の列の代わりに2つまたは3つの列を設定することもできます。たぶん、value_type("number"と"string"の間の列挙型)、number_value、string_valueの3つの列があります。次に、そのクエリを次のように再構築できます

WHERE value_type = 'number' AND number_value > 0.5
于 2008-08-29T14:58:30.187 に答える
0

個別のフィールドを作成して、それらを単一の論理列に結合するようなビューを作成できると思います。それについて何か意見はありますか?

これは、データのソースによって異なります。ユーザー (または他のシステム) から自由形式の方法でデータを取得していて、そのデータの種類をあまり気にしない場合は、最も一般的な方法 (varchar など) を使用して保存するのが最善の方法です。 . 受信データがより構造化されており、その構造を気にする場合は、別のフィールドを使用してその構造をデータベースに保持する方が理にかなっています。

SELECT の観点からは、それはあまり重要ではありません。どちらの方法でも保存でき、同じスキーマとして読み取ることができます。フィルターに入ると(あなたが言及したように)、物事はもう少し複雑になりますが、それでも簡単に実行できます. ただし、このデータを更新できるようにする必要があるかどうか、また必要な場合は、データに検証を適用する必要があるかどうかについては言及していません。

その音から、保存されている値の「タイプ」に基づいて、さまざまなタイプの検索を行う必要があります。そのため、関心のある値のタイプにフィルターをすばやく制限できるように、Type フィールドを追加することは理にかなっています。タイプとは、より論理的なアプリケーション スコープであるタイプを意味することに注意してください。格納されている実際のデータ型ではありません。

UPDATE を簡単にサポートする必要がある場合は Type 列で単一のフィールドを使用するか、SELECTing とフィルタリングだけが必要な場合は複数のフィールド (完全に異なるデータ セットの場合はテーブル) を使用することをお勧めします。

于 2008-08-29T16:09:59.127 に答える
0

「string」列と「numeric」列の 2 つの列 (適切なバリアントが何であれ) を使用して、「string」列は NOT NULL で、「numeric」列は NULL 値を許可することを検討してください。値を挿入するときは、常に型に依存しない「文字列」列に入力しますが、値が数値の場合は、「数値」列にも格納します。これで、タイプに関するインジケータが組み込まれました (「数値」列が入力されている場合は数値であり、そうでない場合は文字列です)。常に「文字列」列から表示する値を取得し、使用できます。計算の「数値」値、または必要に応じて適切な数値の並べ替え/比較を行います。値の型を示す 3 番目の列をいつでも追加できますが、この方法ではその必要がなくなります。

于 2008-08-29T16:22:43.197 に答える
0

データ型として VARCHAR または NVARCHAR を使用することはできないと思います。あなたが説明しているような混合データでは、データベースからフィールドを引き出し、データ型に基づいて適切な CAST または CONVERT を実行するときに値をテストする必要があります。

于 2008-08-29T15:01:38.150 に答える