Эффективный способ выбрать значение по умолчанию в t-sql, когда результаты не найдены - PullRequest
2 голосов
/ 23 ноября 2010

ОК, это довольно простая проблема, но мне интересно: каков наилучший подход с точки зрения эффективности и стиля?

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

Вот несколько подходов, которые я использую:

Сделайте это в коде

--Regular Select in SQL
SELECT myValue FROM dbo.SomeTable WHERE id = @id


//In Data Access Layer
using (IDataReader reader = cmd.ExecuteReader()) {
    if (reader.Read()) {
        return Convert.ToInt32(reader["myValue"]);
    }else {
        return 0; //return a default
    }
}

Гарантия возвращаемого значения в SQL

--SQL stores in a variable and selects null value if available
declare @myVal int
select @myVal = myValue FROM dbo.SomeTable WHERE id = @id

--return value or a default
select ISNULL(@myVal,0) as myValue


//In Data Access Layer
return Convert.ToInt32(cmd.ExecuteScalar());

Есть ли более элегантный способ сделать это?Или более эффективный способ?

Если нет, то какую из них вы бы посчитали лучшей практикой?

Ответы [ 6 ]

2 голосов
/ 23 ноября 2010

Я бы использовал ISNULL(field, replacement_value_if_null) - это встроенная функция T-SQL, и все это сделано со стороны SQL Server, поэтому его легче отлаживать.

Если у кого-то есть какой-то вклад с точки зрения производительности, это может быть полезно!

0 голосов
/ 16 октября 2014

Это старый пост, но если люди все еще ищут ответ, как я не так давно:

Почему вы не могли использовать:

IF(ISNUMERIC(@myVariable) = 1)... Если ваша переменная числовая.

Или, может быть, IF(LEN(@myVariable) > 0)... для строк.

0 голосов
/ 09 апреля 2014

Я использую SQL SERVER 2008 R2.У меня была та же задача для выполнения (вернуть некоторое значение по умолчанию, когда нет действительного значения), и я использовал утверждение ниже.Результатом является значение по умолчанию, но если я добавлю «Флорида» вместо «Английский» - он вернет «FL» в качестве сокращения штата:

--- объявить и дать значение по умолчанию: объявить @myVal varchar(10) = 'Нет результата' select @myVal = StateAbbr FROM dbo.State WHERE StateName = 'English'

- возвращаемое значение или выбор по умолчанию @ myVal

0 голосов
/ 23 ноября 2010

Мне не кажется, что есть большая разница между возвратом NULL или возвратом нуля. В любом случае, ваш код все равно должен делать что-то другое, чем если бы был возвращен результат,У вас все еще будет if-else.Если запись возвращается, сделайте это, иначе сделайте что-то другое.Поэтому я не вижу большой разницы.

Я бы посоветовал вам не использовать DataReader для возврата одного значения.Было бы лучше использовать ExecuteScalar или для лучшей производительности выходной параметр из хранимой процедуры.

0 голосов
/ 23 ноября 2010
((int?)cmd.ExecuteScalar()).GetValueOrDefault();

или

((int?)cmd.ExecuteScalar())??0;

Это то, что вы хотите, я думаю

0 голосов
/ 23 ноября 2010

Я только догадываюсь здесь, но: вы пробовали с этим кодом?

Nullable<Int32> Result = Command.ExecuteScalar();

if (Result == null) Result = 0;

Редактировать: Теперь я проверил, и это работает:

using (SqlConnection Connection = new SqlConnection())
{
    Connection.ConnectionString = "";
    Connection.Open();

    using (SqlCommand Command = Connection.CreateCommand())
    {
        Command.CommandText = "select 'lol' as [column] where 1 = 0";

        String Result = (String) Command.ExecuteScalar();
    }
}

Строка равна нулю. Так что вы можете использовать Nullable, и все готово.

...