2010-09-10 14 views
0

J'ai un proc stocké T-SQL qui fournit une bonne quantité de données à une grille sur une page .NET .... tellement que je mets des choix au sommet de la page pour "0-9" et chaque lettre dans l'alphabet de sorte que lorsque l'utilisateur clique sur la lettre, je veux filtrer mes résultats en fonction des résultats qui commencent par cette première lettre. Disons que nous utilisons des noms de produits. Donc, si l'utilisateur clique sur "A", je veux seulement que mon proc stocké renvoie des résultats où SUBSTRING (ProductName, 1, 1) = "A".T-SQL Instruction de cas utilisant la sous-chaîne et isnumérique

Où je suis accroché est sur les noms de produits qui commencent par un nombre. Dans ce cas, je veux récupérer toutes les valeurs de ProductName où ISNUMERIC (SUBSTRING (ProductName, 1, 1)) = 1. J'utilise un paramètre d'entrée appelé @FL. @FL sera soit un zéro (nous avons peu de produits qui commencent par des chiffres, donc je les regroupe tous ensemble de cette façon).

Bien sûr, il y a aussi l'alternative de WHERE SUBSTRING (ProductName, 1, 1) IN ('0', '1', '2' .....) mais même alors, je n'ai jamais pu Concevoir une instruction CASE qui fera une = sur une évaluation et une déclaration IN pour l'autre.

Voici ce que j'ai dans ma proc pour la partie CAS de ma clause WHERE. Cela ne fonctionne pas, mais cela peut être utile si ce n'est que d'un point de vue pseudocode.

Merci d'avance pour toute idée que vous pourriez avoir.

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 

*** Je sais que cette utilisation de l'instruction CASE est « non standard », mais je l'ai trouvé en ligne et pensé qu'il avait une certaine promesse. Mais les tentatives d'utilisation d'une seule instruction CASE ont abouti au même résultat (une erreur près de '=').

+0

Le boîtier intérieur est redondant - le ISNUMBERIC sera toujours exécutée car @FL a déjà été testé pour être « 0 » –

Répondre

1

Pourquoi ne pas simplement utiliser l'opérateur Like?

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

Quand ils sélectionnez l'option Tout numéro, passez @FL comme '[0-9]'

(Je suppose que vous avez un index sur cette colonne de nom?)

+0

Comme votre pensée, mais étant donné que @FL sera 0 ou une lettre, comment cela fonctionnerait-il pour des valeurs où le premier personnage est 1-9? Je ne vois pas comment cela fonctionne pour les numériques. – Mike

+0

voir edit, Comme peut accepter une plage de valeurs entre crochets ... –

+0

@Charles - parce qu'il y a si peu de résultats numériques, j'ai combiné 0-9 dans mon lien de page et une valeur @FL de 0 est représentée pour * tout * produit qui commence par un caractère numérique .... a un sens? – Mike

1

Pour voler un peu de Charles:

AND Substring(dbo.AssnCtrl.Name, 1, 1) Like 
    CASE WHEN @FL = '0' THEN '[0-9]' 
    ELSE @FL    
    END 
+0

Doh.Commentaires dans Charles réponse mis à jour pour inclure ma solution. – Bill

+0

+1: Testé sur SS2005, fonctionne pour moi. –

+0

mieux encore est d'éliminer l'appel à la fonction de sous-chaîne. 'AND dbo.AssnCtrl.Name Comme CASE @FL QUAND '0' PUIS '[0-9]' ELSE @FL END + '%'' –

0

Avez-vous essayé

AND (
     isnumeric(substring(dbo.AssnCtrl.Name, 1, 1)) = 1 
    or 
     SUBSTRING(dbo.AssnCtrl.Name, 1, 1) = @FL ) 

cela fonctionne pour moi:

select * from casefile where 
isnumeric(substring(pmin,1,1)) = 1 
or 
substring(pmin,1,1) = 'a'