Хранение N / A в Sql Server - PullRequest
6 голосов
/ 19 февраля 2010

У нас есть форма с несколькими полями различных типов данных, включая строку, дату и время.

Наш клиент хочет иметь возможность писать N / A (неприменимо) в любом из этих полей,а также возможность оставить это поле пустым.

Есть ли у кого-нибудь идеи о том, как я должен разработать свою таблицу Sql Server, чтобы она могла поддерживать значение NULL или N / A?

Мыиспользуете Sql Server 2008.

Ответы [ 6 ]

4 голосов
/ 19 февраля 2010

Если N / A и пустое значение - это действительно разные значения, которые вам нужно поддерживать, я бы сказал, чтобы создать поле в виде пустого поля (в этом случае NULL будет представлять пустое значение), а затем включить второе битовое поле для[FieldName] NotAvailable или [FieldName] указано.

Конечно, вы будете использовать два отдельных поля для представления одного логического концепта, попытка принудительно объединить все это в одно поле приводит к тому, что два концепта сохраняются в одном поле (поле интерпретируется одним способом, еслиэто какая-то магическая ценность, значит это что-то другое).Таким образом, с отдельным полем становится намного более ясным, каково ожидаемое поведение полей.

1 голос
/ 19 февраля 2010

Если им нужно только одно состояние, вы можете, как указывают другие люди, просто перевести ноль:

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

Если обнаружено, что они действительно хотят иметь «три состояния» на столбце, вы можете создать сопутствующий столбец VARCHAR.

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

Преимущества:

  • Если они снова передумают, вы можете изменить значение companioncolumn1.
  • Если вы используете оба столбца в COALESCE, он автоматически получает первый столбец, если он не равен нулю, получает вспомогательное значение, если установлено, а первый равен нулю, и имеет запасной вариант к «N / A», указанному в выберите.
  • Вы можете управлять этим на уровне базы данных
  • Вы поддерживаете тип данных исходного столбца

Недостатки:

  • Имеет дополнительный столбец в базе данных для управления.
  • Чуть более сложные операторы SELECT
  • Вы должны управлять этим на уровне базы данных
  • Приведение и проверка типов будут более сложными, но у вас уже есть эта проблема
0 голосов
/ 19 февраля 2010

Независимо от типа данных столбца, по умолчанию может применяться значение null.При возврате результатов вы можете использовать

Select Isnull(colX,'N/A')

или Select Coalesce(collX,'N/A')

0 голосов
/ 19 февраля 2010

Как уже упоминали другие, varchar или nvarchar - ваше лучшее решение.

0 голосов
/ 19 февраля 2010

Я бы сохранил ответ в одном поле varchar (или nvarchar).

Код приложения может проверять и интерпретировать ввод как число или дату и т. Д. Метаинформация о поле подскажет вам, как его интерпретировать.

В этом сценарии вы можете иметьNULL, или пусто, или N / A, или реальное значение ...

0 голосов
/ 19 февраля 2010

Единственный тип, о котором я мог подумать, это varchar.

Вам потребуется код для интерпретации данных, основанных на поле (т. Е. Если имя поля InvoiceDate, это дата).

РЕДАКТИРОВАТЬ: После прочтения вашего последнего комментария, вы можете иметь поле «IsNA» (бит) для каждого из полей. Поэтому, если пользователь выбирает «NA» для InvoiceDate, установите для «IsInvoiceDateNA» значение true и false (в противном случае).

Вид экрана будет отображаться в соответствии с полем but для каждого поля ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...