在SQL Server 2005中,如何建模一个既可以包含数字又可以包含字符串值的字段?

4
我需要创建一个新的数据库表,它包含一个 "ID"、一个 "name" 和一个 "value"。这个 "value" 字段可以是数值型或字符型。
我不想仅将字段设置为 "varchar",因为我也想使用类似 "WHERE value > 0.5" 这样的过滤查询。
在 SQL Server 2005 中,最好的建模方式是什么?
编辑:我不反对在此处创建多个字段(一个用于数字,一个用于非数字),但由于它们实际上都是相同的概念,我不确定这是否是一个好主意。我猜我可以创建单独的字段,然后有一个视图将它们合并成一个逻辑列。
任何意见吗?
我的目标非常简单……通常这些数据将被盲目地显示在网格视图中。我还希望能够在该网格中过滤数值。这个表最终会有数千万条记录,所以我不想在查询性能方面遇到问题。我的主要关注点是查询性能。
9个回答

3

获取所需的查询支持的好方法是有两列:numvalue 存储数字和 textvalue 存储字符。它们应该是可空的或至少有一些默认值,表示没有值。您的应用程序可以决定将哪个列存储其值,哪个列不存储任何值。


2

您的问题可能与混合数据有关,这可能是因为Sql 2005对文本数据排序时并不是一种“自然”排序方式。

如果您有一个varchar字段,并且执行以下操作:

where value > '20.5'

值如“5”将出现在您的结果中(因为在基于字符的排序中,“5”在“20.5”之后)

如果需要存储,最好使用单独的列。

如果需要在结果中合并它们,请使用Coalesce将它们合并为一个列:

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

0

两列。

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

0
如果您希望它能够保存字符字符串,我认为您需要将该列设置为varchar或类似类型。
另一种选择是使用2或3个列代替一个值列。也许可以有三个列,value_type(在“number”和“string”之间的枚举),number_value,string_value。然后您可以重构查询。
WHERE value_type = 'number' AND number_value > 0.5

0
如果您想在同一列中存储数字和字符串值,我不确定您是否可以避免在使用该列作为查询过滤器时进行大量的强制转换。

0

我认为不可能同时拥有varchar和int类型的列。您可以将值保存为varchar,并在查询期间将其转换为int。但是,如果您的值包含任何字符,这样做可能会导致异常。您想要实现什么目标?


0

我认为你无法避免使用VARCHAR或NVARCHAR作为数据类型。对于像你描述的混合数据,你必须在从数据库中提取字段时测试其值,并根据数据类型执行适当的CAST或CONVERT操作。


0
我想我可以创建单独的字段,然后有一个视图将它们合并成一个逻辑列。对此有什么看法吗?
这取决于数据的来源。如果您以某种自由形式从用户(或其他系统)获取数据,并且不真正关心数据类型,则最好的存储方式是最通用的方式(varchar等)。如果传入的数据更加结构化,并且您关心该结构,则使用单独的字段保留该结构在数据库中更有意义。
从SELECT的角度来看,实际上并不重要;您可以以任何方式存储它,并将其读取为相同的模式。一旦涉及到过滤器(如您所提到的),事情就会变得有些棘手,但仍然很容易做到。但是,您没有提到是否需要能够更新此数据,如果需要,是否需要对数据进行任何验证。
从听起来的情况来看,您需要根据存储的“类型”进行不同类型的搜索。因此,添加一个“类型”字段可能是有意义的,以便任何过滤器可以快速限制到您关心的值类型。请注意,我所说的“类型”是更逻辑、应用范围的类型;而不是实际存储的数据类型。
我的建议是,如果您需要轻松支持更新,则使用带有类型列的单个字段;如果只需要选择和过滤,则使用多个字段(或表,如果这些是完全不同的数据集)。

0
您可以考虑使用两列,一列为“字符串”类型,另一列为“数字”类型(适当的变体),其中“字符串”列为NOT NULL,而“数字”列允许NULL值。插入值时,始终填充“字符串”列,独立于类型,但是如果该值是数字,则还要将其存储在“数字”列中。现在,您已经内置了一个指示器来表示类型(如果“数字”列已填充,则为数字;否则为字符串),始终可以从“字符串”列中提取显示值,并且可以根据需要在计算或正确的数字排序/比较中使用“数字”值。您可以始终添加第三列以指示值类型,但这种方法消除了此需求。请注意,您可以考虑使用一组INSERT和UPDATE触发器来维护数字和字符串值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接