Оператор T-SQL Case, использующий подстроку и цифру
У меня есть хранимый процесс T-SQL, который поставляет большое количество данных в сетку на странице.NET.... настолько, что я помещаю варианты в верхней части страницы для "0-9" и каждой буквы в алфавит, так что когда пользователь нажимает на букву, я хочу отфильтровать свои результаты на основе результатов, которые начинаются с этой первой буквы. Допустим, мы используем названия продуктов. Поэтому, если пользователь нажимает "A", я хочу, чтобы мой сохраненный процесс возвращал результаты, где SUBSTRING(ProductName, 1, 1) = "A".
Я зациклен на названиях продуктов, которые начинаются с цифры. В этом случае я хочу получить все значения ProductName, где ISNUMERIC(SUBSTRING(ProductName, 1, 1)) = 1. Я использую входной параметр @FL. @FL будет либо нулем (у нас мало продуктов, которые начинаются с цифр, поэтому я собираю их все вместе таким образом).
Конечно, есть также альтернатива WHERE SUBSTRING(ProductName, 1, 1) IN ('0', '1', '2'.....), но даже тогда я так и не смог разработать оператор CASE это будет делать = для одной оценки и оператор IN для другой.
Вот что у меня есть в моем proc для части CASE моего предложения WHERE. Это не работает, но может быть полезным, если только с точки зрения псевдокода.
Заранее спасибо за любые идеи, которые вы можете иметь.
AND CASE @FL
WHEN "0" THEN
CASE WHEN @FL = "0" THEN
isnumeric(substring(dbo.AssnCtrl.Name, 1, 1)) = 1
ELSE
SUBSTRING(dbo.AssnCtrl.Name, 1, 1) = @FL
END
END
*** Я знаю, что это использование оператора CASE является "нестандартным", но я нашел его в Интернете и подумал, что у него есть какое-то обещание. Но попытки использовать одну инструкцию CASE дали тот же результат (ошибка около '=').
3 ответа
Почему бы просто не использовать оператор Like?
Where dbo.AssnCtrl.Name Like @FL + '%'
Когда они выбирают опцию Any Number, передайте @FL как '[0-9]'
(Я полагаю, у вас есть индекс для этого столбца имени?)
Чтобы немного украсть у Чарльза:
AND Substring(dbo.AssnCtrl.Name, 1, 1) Like
CASE WHEN @FL = '0' THEN '[0-9]'
ELSE @FL
END
Ты пытался
AND (
isnumeric(substring(dbo.AssnCtrl.Name, 1, 1)) = 1
or
SUBSTRING(dbo.AssnCtrl.Name, 1, 1) = @FL )
это работает для меня:
select * from casefile where
isnumeric(substring(pmin,1,1)) = 1
or
substring(pmin,1,1) = 'a'