2010-02-19 193 views
4

我们有一个表单有多个不同数据类型的字段,包括字符串,日期时间和数字。在Sql Server中存储N/A

我们的客户希望能够在这些字段中的任何一个中写入N/A(不适用),并且能够将其留空。

有人有一个想法,我应该如何设计我的Sql Server表,以便它可以支持值,NULL或N/A?

我们使用的是SQL Server 2008中

+1

从客户的业务角度看,那是什么“N/A”与空白之间的区别? – 2010-02-19 18:44:31

+0

我不确定我是否理解这个问题。你想要一个日期时间或数字列允许一个空值(这是微不足道的)和N/A的值(这似乎不可能,除非你指定一个特定的值,如数字或最小日期时间指定N /一个)。 – 2010-02-19 18:45:30

+1

@Mike:Null可能意味着用户从未看到过该选项,N/A意味着他们明确决定。 – 2010-02-19 18:46:11

回答

3

如果N/A,你需要支持的空白是真正的价值观不同,我想说创建字段作为一个可空字段(这种情况下NULL将代表空白值),然后为[FieldName] NotAvailable或[FieldName] Specified包含第二个比特字段。当然,你将使用两个单独的字段来表示一个单一的逻辑概念,试图强制它全部进入一个字段导致两个概念被存储在同一个字段中(字段被解释为一种方式,除非有一些神奇的价值,那么它意味着别的东西)。这样,通过单独的领域,这些领域的预期行为将会更加清晰。

+0

+1,需要在GUI上为每个字段添加一个“N/A”复选框 – 2010-02-19 19:44:16

+0

@KM我们使用DevExpress并且它们允许每个控件内都有一个按钮。所以我们在所有编辑器的左边添加了一个“N/A”按钮(复选框除外) – 2010-02-19 20:50:13

0

我能想到的唯一类型是VARCHAR。

您将不得不有代码来解释基于该字段的数据(即如果该字段的名称是InvoiceDate,它是一个日期)。

编辑:在阅读您最近的评论后,您可以有一个“IsNA”(位)字段为每个字段。因此,如果用户选择“NA”作为InvoiceDate,请将“IsInvoiceDateNA”设置为true & false(否则)。

屏幕的视图将根据每个输入字段的字段驱动。

0

我会将答案存储在单个varchar(或nvarchar)字段中。

应用程序代码可以验证和解释输入是一个数字或日期等。有关该字段的元信息将告诉您如何解释它。

在这种情况下,你可以有NULL,或者空白,或者N/A,或一个真正的价值...

0

正如其他人所提到的,为varchar或nvarchar是您的最佳解决方案。

0

无论列的数据类型如何,都可以应用默认空值。当返回的结果,你既可以使用

Select Isnull(colX,'N/A') 

Select Coalesce(collX,'N/A')

1

如果他们只想要一个状态,你可以像其他人表示只是翻译空:

SELECT COALESCE(thecolumn1,'N/A') AS mycolumnalias 

如果发现他们真的渴望拥有塔上的“三态”,你可以创建一个伴随的VARCHAR列。

SELECT COALESCE(thecolumn1, companioncolumn1,'N/A') AS mycolumnalias 

优点:

  • 如果他们再次改变主意,你可以改变companioncolumn1值。
  • 如果您在COALESCE中使用两个列,它将在第一列不为空时自动获取第一列,如果设置了第一列并且第一列为空,并且具有回退到在第一列中指定的“N/A”选择。
  • 您可以在数据库层
  • 管理这个你保持origial列

缺点的数据类型:

  • 先后在数据库中的额外的列来管理。
  • 稍微复杂的SELECT语句
  • 你必须在数据库层
  • 类型转换和验证会更加复杂而难以管理,但你有这个问题已经