4 Stimmen

Wie sollte ich ein Feld modellieren, das in SQL Server 2005 sowohl numerische als auch String-Werte enthalten kann?

Ich habe eine neue Datenbanktabelle, die ich erstellen muss...
Sie enthält logischerweise eine ID , a name und eine "value" .
Dieses Wertfeld kann entweder numerisch oder eine Zeichenkette sein.

Ich glaube nicht, dass ich das Feld einfach zu einem varchar denn ich möchte auch Abfragen mit Filtern durchführen können wie WHERE value > 0.5 und so weiter.

Wie lässt sich dieses Konzept in SQL Server 2005 am besten modellieren?

EDIT: Ich bin nicht dagegen, hier mehrere Felder zu erstellen (eines für Zahlen, eines für Nicht-Zahlen), aber da es sich um dasselbe Konzept handelt, war ich mir nicht sicher, ob das eine gute Idee ist.
Ich schätze, ich könnte separate Felder erstellen und dann eine Ansicht haben, die sie zu einer einzigen logischen Spalte zusammenfasst.

Haben Sie dazu eine Meinung?

Was ich erreichen möchte, ist eigentlich ziemlich einfach... normalerweise werden diese Daten einfach blind in einer rasterartigen Ansicht angezeigt.
Ich möchte auch in der Lage sein, nach den numerischen Werten in dieser Tabelle zu filtern. Diese Tabelle wird am Ende in den zig Millionen von Datensätzen, so dass ich nicht wollen, malen mich in eine Ecke mit Abfrageleistung.
Die Abfrageleistung ist meine Hauptsorge.

3voto

Joseph Daigle Punkte 46087

Eine gute Möglichkeit, die gewünschte Abfrageunterstützung zu erhalten, besteht darin, zwei Spalten zu haben: numvalue zum Speichern einer Zahl und textvalue zum Speichern von Zeichen. Sie sollten nullbar sein oder zumindest einen Standardwert haben, der keinen Wert darstellt. Ihre Anwendung kann dann entscheiden, in welcher Spalte der Wert gespeichert wird und in welcher kein Wert steht.

2voto

Keith Punkte 141163

Ihr Problem mit dem Mischen von Daten kann sein, wie Sql 2005 Textdaten sortiert. Es ist keine "natürliche" Sortierung.

Wenn Sie ein varchar-Feld haben, und das haben Sie:

where value > '20.5'

Werte wie "5" werden in Ihrem Ergebnis erscheinen (da bei einer zeichenbasierten Sortierung "5" nach "20.5" kommt)

Sie sind besser dran mit separaten Säulen für die Lagerung.

Verwenden Sie Coalesce, um sie in einer Spalte zusammenzufassen, wenn Sie sie in Ihren Ergebnissen zusammenführen möchten:

select [ID], [Name], Coalesce( [value_str], [value_num] )
from [tablename]

0voto

Tundey Punkte 2825

Wenn Sie numerische und String-Werte in derselben Spalte speichern wollen, bin ich mir nicht sicher, ob Sie bei der Verwendung dieser Spalte als Abfragefilter nicht eine Menge von Casts und Konvertierungen durchführen müssen.

0voto

jason saldo Punkte 9556

Zwei Spalten.

Table: (ValueLable as char(x), Value as numerica(p,s))

0voto

jdecuyper Punkte 3906

Ich glaube nicht, dass es möglich ist, eine Spalte mit beiden Typen varchar und int zu haben. Sie könnten Ihren Wert als varchar speichern und ihn während Ihrer Abfrage in int umwandeln. Aber auf diese Weise könnten Sie eine Ausnahme erhalten, wenn Ihr Wert ein Zeichen enthält. Was wollen Sie erreichen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X