Запрос SQL Server с нулевым значением - PullRequest
2 голосов
/ 11 октября 2010

В моем коде на C # я должен выполнить SQL-запрос следующим образом:

context.ExecuteStoreQuery("SELECT * FROM MyTable WHERE Field0 = {0} AND 
    Field1 = {1}", field0, field1)

Когда field1 = null в c # и NULL в базе данных, этот запрос не работает.(Я должен использовать другой синтаксис с IS NULL)

Как я могу исправить это, не делая if (на самом деле, у меня есть 10 полей ...)?

Ответы [ 4 ]

4 голосов
/ 11 октября 2010

По умолчанию сервер SQL не позволяет сравнивать значение с null. Все сравнения разрешаются до false, даже те, которые логически противоположны. Другими словами, вы можете сделать:

where field = 1 и where field <> 1. Если field равно нулю, оба логически преобразуются в ложь.

В любом случае вам нужна явная проверка для null в вашем запросе:

context.ExecuteStoreQuery(@"SELECT * FROM MyTable WHERE 
    (Field0 = {0} or (Field0 is null and {0} is null))  AND 
    (Field1 = {1} or (Field1 is null and {0} is null))", field0, field1)
0 голосов
/ 12 октября 2010

ну, во-первых, я бы убрал выбор *.ПЛОХО!

Второе, что я хотел бы сделать, это сделать эту процедуру хранимой.

0 голосов
/ 11 октября 2010
public string appendCondition(String sqlQuery, String field, Object value)
{ 
 string resultQuery = sqlQuery + " " + value == null ? " IS NULL " : "=" + value.ToString();
 return resultQuery;
}

Надеюсь, вы можете добавить простую логику, чтобы добавить "ГДЕ" или "И" самостоятельно.

0 голосов
/ 11 октября 2010

вы можете использовать краткий вариант оператора if. Я не думаю, что вы справитесь со своей проблемой без заявления if. Пример:

String.Format("SELECT * FROM MyTable WHERE Field0 {0} ", value==null ? "IS NULL" : String.Format("= {0}", value))

Также возможно параметризовать запрос, используя "@ParameterName"

context.ExecuteStoreQuery<ProductionUnit>(
  String.Format("SELECT * FROM MyTable WHERE Field0 {0} @Parameter1",
  value==null ? "IS", "="), new SqlParameter("@Parameter1", value));

Привет

...