Come dovrei modello di un campo che può contenere sia numerici e i valori stringa in SQL Server 2005?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Ho una nuova tabella nel database ho la necessità di creare...
Logicamente contiene un ID, un name, e un "value".
Che valore di campo potrebbe essere numerici o di una stringa di caratteri in natura.

Non penso che voglia solo fare il campo di un varchar, perché voglio anche essere in grado di eseguire query con i filtri WHERE value > 0.5 e tale.

Qual è il modo migliore per modello di questo concetto in SQL Server 2005?

EDIT: Io non sono contrario alla creazione di più qui i campi (uno per i numeri, uno per non numeri), ma dato che sono tutti davvero lo stesso concetto, non ero sicuro che fosse una grande idea.
Credo si potrebbe creare campi separati, quindi hanno una vista che l'ordinamento assegna loro in una singola colonna logica.

Eventuali pareri in merito?

Quello che voglio ottenere è molto semplice...di solito questo tipo di dati sarà solo ciecamente visualizzati in una griglia di tipo a vista.
Voglio essere anche in grado di filtrare i valori numerici in che griglia.Questa tabella sarà in decine di milioni di record, quindi non ho voglia di dipingere me stesso in un angolo con prestazioni di esecuzione delle query.
Che prestazioni di esecuzione delle query è la mia preoccupazione principale.

È stato utile?

Soluzione

Il problema con la miscelazione dei dati può essere come Sql 2005 i tipi di dati di testo.Non è un 'naturale' sorta.

Se si dispone di un campo varchar e fa:

where value > '20.5'

Valori come "5" sarà il tuo risultato (come in un personaggio basato ordinamento "5" viene dopo "20.5")

Si sta andando ad essere meglio con colonne separate per l'archiviazione.

Utilizzare la funzione Coalesce per unirli in una colonna, se necessario unite i vostri risultati:

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

Altri suggerimenti

Un buon modo per ottenere il supporto di query che si desidera è di avere due colonne:numvalue che memorizza un numero e textvalue che memorizza i caratteri.Essi dovrebbero essere annullabile o almeno alcuni di default che rappresenta alcun valore.L'applicazione può quindi decidere quale colonna per memorizzare il valore e quali lasciare senza valore.

Se si desidera memorizzare numerico e valori di stringa nella stessa colonna, io non sono sicuro che si può evitare di fare un sacco di calchi e converte quando si utilizza la colonna come un filtro di query.

due colonne.

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

Non penso sia possibile avere una colonna con entrambi varchar e di tipo int.Si potrebbe salvare il vostro valore come un varchar e il cast a int durante la vostra query.Ma in questo modo si potrebbe ottenere un'eccezione se il valore non contenere qualsiasi carattere.Cosa stai cercando di realizzare?

Se si desidera essere in grado di tenere una stringa di caratteri, penso che è necessario per rendere la colonna varchar o simili.

Un'alternativa potrebbe essere quella di avere 2 o 3 colonne, invece di un valore di colonna.Forse sono le tre colonne, value_type (enum tra il "numero" e "stringa"), number_value, string_value.Poi si potrebbe ricostruire la query per essere

WHERE value_type = 'number' AND number_value > 0.5

Non credo che si sta andando ad essere in grado di spostarsi utilizzando VARCHAR o NVARCHAR come tipo di dati.Con un misto di dati, come stai descrivendo, dovrete testare il valore quando si tira il campo del db ed eseguire le opportune CAST o CONVERT base al tipo di dati.

Credo si potrebbe creare campi separati, quindi hanno una vista che l'ordinamento assegna loro in una singola colonna logica.Eventuali pareri in merito?

Dipende dalla fonte di dati.Se si sono sempre dati da parte degli utenti (o qualche altro sistema) in free-form modo e non mi importa che tipo di dati, quindi il modo migliore per conservare il più generico modo (varchar, ecc).Se i dati in ingresso è più strutturato e si preoccupano che la struttura, quindi ha più senso mantenere la struttura del database, utilizzando diversi campi.

Dal punto di vista di una SELECT non importa;è possibile memorizzare qualsiasi modo e leggere come lo stesso schema.Una volta che si ottiene in filtri (come dici) le cose si fanno un po ' più peloso, ma ancora facilmente fattibile.Tuttavia, non si menziona se avete bisogno di essere in grado di aggiornare i dati, e se è così, se è necessario applicare alcuna convalida dei dati.

Dai suoni di esso, è necessario fare diversi tipi di ricerche in base al "tipo" di valore memorizzato.Come tale, essa può avere un senso per aggiungere un campo di Tipo in modo che tutti i filtri possono essere rapidamente limitato per il tipo di valori che ti interessano.Nota, per Tipo intendo più logica, ambito di applicazione, Tipo;non proprio il tipo di dati memorizzati.

Il mio consiglio sarebbe quello di utilizzare un unico campo con una colonna di Tipo se hai bisogno per supportare gli Aggiornamenti o utilizzare più campi (o tabelle, se questi sono totalmente diversi insiemi di dati) se la Selezione e filtraggio è tutto ciò che è necessario.

Si potrebbe considerare l'utilizzo di due colonne, una "stringa" e uno di "numerico" (qualunque cosa varianti di coloro che sono appropriati) con la "stringa" colonna NOT NULL e "numerico" colonna che ammette valori NULL.Quando si inserisce un valore, sempre popolano la "stringa" colonna indpendent del tipo, tuttavia, se il valore è numerico, INOLTRE, l'archivio, il "numerico" colonna.Ora si dispone di un costruito in indicatore per il tipo "numerico" colonna è popolato numerica, se non che è una stringa), può sempre e solo tirare il valore per la visualizzazione da "stringa" di colonna, e possibile utilizzare il "numerico" valore in calcoli o per il corretto ordinamento / confronto come necessario.Si può sempre aggiungere una terza colonna che indica il tipo di valore, ma questo approccio elimina la necessità per che.Si noti che si potrebbe prendere in considerazione il mantenimento numerico e valori di stringa utilizzando un set di trigger INSERT e UPDATE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top