Оператор T-SQL Case, использующий подстроку и цифру - PullRequest
0 голосов
/ 11 сентября 2010

У меня есть хранимый процесс 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 ]

1 голос
/ 11 сентября 2010

Чтобы немного украсть у Чарльза:

AND Substring(dbo.AssnCtrl.Name, 1, 1) Like
  CASE WHEN @FL = '0' THEN '[0-9]'
    ELSE @FL            
  END
1 голос
/ 11 сентября 2010

Почему бы просто не использовать оператор Like?

   Where dbo.AssnCtrl.Name Like @FL + '%' 

Когда они выбирают опцию Любой номер, передайте @FL как '[0-9]'

(я полагаю, у вас есть индекс для этого столбца имени?)

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

Вы пробовали

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'
...