Wie soll ich in SQL Server 2005 ein Feld modellieren, das sowohl numerische als auch Zeichenfolgenwerte enthalten kann?

StackOverflow https://stackoverflow.com/questions/34398

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe eine neue Datenbanktabelle, die ich erstellen muss ...
Es enthält logischerweise eine ID, A name, und ein "value".
Dieses Wertfeld kann entweder numerisch oder eine Zeichenfolge sein.

Ich glaube nicht, dass ich das Feld einfach zu einem machen möchte varchar, weil ich auch mit Filtern wie abfragen möchte WHERE value > 0.5 und derartige.

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

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

Irgendwelche Meinungen dazu?

Was ich erreichen möchte, ist eigentlich ziemlich einfach ...Normalerweise werden diese Daten einfach blind in einer Rasteransicht angezeigt.
Ich möchte auch nach den numerischen Werten in diesem Raster filtern können.Am Ende wird diese Tabelle Dutzende Millionen Datensätze umfassen, daher möchte ich mich nicht mit der Abfrageleistung in die Enge treiben.
Diese Abfrageleistung ist mein Hauptanliegen.

War es hilfreich?

Lösung

Ihr Problem beim Mischen von Daten könnte darin liegen, wie SQL 2005 Textdaten sortiert.Es ist keine „natürliche“ Sorte.

Wenn Sie ein Varchar-Feld haben und Folgendes tun:

where value > '20.5'

Werte wie „5“ werden in Ihrem Ergebnis enthalten sein (wie bei einer zeichenbasierten Sortierung kommt „5“ nach „20,5“).

Mit separaten Spalten zur Aufbewahrung sind Sie besser bedient.

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

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

Andere Tipps

Eine gute Möglichkeit, die gewünschte Abfrageunterstützung zu erhalten, sind zwei Spalten:Numvalue, der eine Zahl speichert, und Textvalue, der Zeichen speichert.Sie sollten nullwertfähig sein oder zumindest einen Standardwert haben, der keinen Wert darstellt.Ihre Anwendung kann dann entscheiden, welche Spalte ihren Wert speichert und welche ohne Wert belässt.

Wenn Sie numerische Werte und Zeichenfolgenwerte in derselben Spalte speichern möchten, bin ich nicht sicher, ob Sie viele Umwandlungen und Konvertierungen vermeiden können, wenn Sie diese Spalte als Abfragefilter verwenden.

zwei Spalten.

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

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

Wenn Sie möchten, dass es eine Zeichenfolge enthalten kann, müssen Sie meiner Meinung nach die Spalte varchar oder ähnliches erstellen.

Eine Alternative könnte darin bestehen, 2 oder 3 Spalten anstelle der Spalte mit einem Wert zu haben.Vielleicht haben Sie die drei Spalten value_type (Aufzählung zwischen „number“ und „string“), number_value, string_value.Dann könnten Sie diese Abfrage so rekonstruieren

WHERE value_type = 'number' AND number_value > 0.5

Ich glaube nicht, dass Sie um die Verwendung von VARCHAR oder NVARCHAR als Datentyp herumkommen werden.Bei gemischten Daten, wie Sie sie beschreiben, müssen Sie den Wert testen, wenn Sie das Feld aus der Datenbank ziehen und je nach Datentyp das entsprechende CAST oder CONVERT durchführen.

Ich denke, ich könnte separate Felder erstellen und dann eine Ansicht haben, die sie in einer einzigen logischen Spalte zusammenfasst.Irgendwelche Meinungen dazu?

Es kommt auf die Quelle der Daten an.Wenn Sie die Daten von Benutzern (oder einem anderen System) in freier Form erhalten und sich nicht wirklich darum kümmern, um welche Art von Daten es sich handelt, ist die beste Möglichkeit, sie zu speichern, die allgemeinste Art (varchar usw.). .Wenn die eingehenden Daten strukturierter sind und Ihnen diese Struktur wichtig ist, ist es sinnvoller, diese Struktur in der Datenbank beizubehalten, indem Sie separate Felder verwenden.

Aus der Sicht eines SELECT spielt es keine Rolle;Sie können es in beiden Fällen speichern und als dasselbe Schema lesen.Sobald Sie sich mit den Filtern beschäftigen (wie Sie bereits erwähnt haben), werden die Dinge etwas schwieriger, aber immer noch leicht machbar.Sie erwähnen jedoch nicht, ob Sie diese Daten aktualisieren müssen und wenn ja, ob Sie eine Validierung der Daten erzwingen müssen.

Wie sich das anhört, müssen Sie je nach „Typ“ des gespeicherten Werts verschiedene Arten von Suchen durchführen.Daher kann es sinnvoll sein, ein Feld „Typ“ hinzuzufügen, damit alle Filter schnell auf die Art von Werten beschränkt werden können, die Sie interessieren.Beachten Sie, dass ich mit Typ einen logischeren Typ mit Anwendungsbereich meine;nicht der tatsächliche Datentyp, der gespeichert wird.

Meine Empfehlung wäre, ein einzelnes Feld mit einer Typspalte zu verwenden, wenn Sie UPDATEs problemlos unterstützen müssen, oder mehrere Felder (oder Tabellen, wenn es sich um völlig unterschiedliche Datensätze handelt), wenn nur AUSWÄHLEN und Filtern erforderlich ist.

Sie könnten in Betracht ziehen, zwei Spalten zu verwenden, eine „Zeichenfolge“ und eine „numerische“ Spalte (je nachdem, welche Varianten davon geeignet sind), wobei die „Zeichenfolge“-Spalte NICHT NULL ist und die „numerische“ Spalte NULL-Werte zulässt.Füllen Sie beim Einfügen eines Werts immer die Spalte „Zeichenfolge“ aus, unabhängig vom Typ. Wenn der Wert jedoch numerisch ist, speichern Sie ihn AUCH in der Spalte „numerisch“.Jetzt haben Sie einen eingebauten Indikator für den Typ (wenn die Spalte „numerisch“ ausgefüllt ist, ist sie numerisch, andernfalls handelt es sich um eine Zeichenfolge), können den anzuzeigenden Wert immer einfach aus der Spalte „Zeichenfolge“ abrufen und verwenden der „numerische“ Wert in Berechnungen oder für die richtige numerische Sortierung/Vergleich nach Bedarf.Sie könnten jederzeit eine dritte Spalte hinzufügen, die den Werttyp angibt, aber dieser Ansatz macht dies überflüssig.Beachten Sie, dass Sie möglicherweise die Beibehaltung der numerischen Werte und Zeichenfolgenwerte mithilfe einer Reihe von INSERT- und UPDATE-Triggern in Betracht ziehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top