Оператор 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'
Другие вопросы по тегам