#sql #sql_server
Есть у меня функция
SqlCommand GetCommand(string value)
{
var comm = new SqlCommand();
comm.CommandText = "SELECT * FROM MyTable WHERE anyField = @param";
comm.Parameters.Add("@param").Value = value;
****
}
А как быть со случаями, когда value передается null? Ведь язык TSQL не есть фильтр
вида anyField = null. Неужели переписывать на этот случай заново весь запрос, исправляя
на anyField is null? Просто параметров на самом деле много, и каждому предусматривать
значение null как-то не по христиански.
UPD:
Я сделал так... Еще не тестировал, но посмотрите, не чересчур ли это?
if (filters != null)
{
var pCounter = 0;
filtersPart = $" WHERE ({string.Join(" OR ", filters.Select(d => $"({string.Join("
AND ", d.Select(kv => kv.Value.Value != null ? (kv.Value.Key ? $"[{kv.Key}] = @param{++pCounter}"
: $"[{kv.Key}] LIKE @param{++pCounter}") : $"[{kv.Key}] is null"))})"))}) ";
pCounter = 0;
foreach(var d in filters)
foreach(var kv in d)
if (kv.Value.Value != null)
res.Parameters.AddWithValue($"param{++pCounter}", kv.Value.Value);
}
filters тут это List>>, где List -
это список фильтров через OR, dictionary - это список фильтров через AND, где string
- это имя столбца, KeyValuePair - это значение столбца и булейное значение, указывающее,
четкое ли нужно совпадение (= @param) или похожее (LIKE @param)
Ответы
Ответ 1
Как-то так: SqlCommand GetCommand(string value) { var comm = new SqlCommand(); comm.CommandText = @" SELECT * FROM MyTable WHERE (anyField = @param or anyField is NULL and @param is NULL) -- and/or (другие условия)"; comm.Parameters.AddWithValue("@param", (object)value ?? DBNull.Value); ... } Можно comm.CommandText = "SELECT * FROM MyTable WHERE ISNULL(anyField, '') = ISNULL(@param, '')"; но это хуже в плане возможного использования индексов, т.к. будет потеряно sargability. Либо действительно динамический запрос. Если value != null то запрос один: SELECT * FROM MyTable WHERE anyField = @param а если value == null, то другой: SELECT * FROM MyTable WHERE anyField is NULL Да, может быть сложнее в построении (когда много параметров), но может оказаться выгоднее для исполнения.
Комментариев нет:
Отправить комментарий