Maison  >  Questions et réponses  >  le corps du texte

SQL Server : utilisation de l'expression CASE WHEN avec la clause WHERE

J'ai un nouveau projet Spring Boot avec SQL Server et je dois remplacer les requêtes natives MySQL sur les méthodes du référentiel de l'ancien projet par des requêtes natives SQL Server. Il s'agit d'une requête complexe où la condition est un cas où une expression. Lorsque j'essaie de tester la requête dans SQL Server Management Studio, une erreur s'affiche, comme indiqué dans l'image ci-dessous. Entrez la description de l'image ici

Il s'agit de mon ancienne requête native utilisant MySQL sur la méthode du référentiel et je souhaite la remplacer par SQL Server Entrez la description de l'image ici S'il vous plaît, aidez-moi à trouver une solution. Merci d'avance! !

P粉270842688P粉270842688180 Il y a quelques jours362

répondre à tous(1)je répondrai

  • P粉904191507

    P粉9041915072024-04-04 13:18:23

    C'est ce que vous avez et ce que vous devez publier sous forme de texte dans votre question. Sous forme de texte, il peut être recherché et copié par quelqu'un essayant de vous aider.

    case when @num = 1 then p.merchant_name = @query else 1=1 end

    CASE est une expression en TSQL. Ce n'est pas une construction de contrôle de flux comme beaucoup d'autres langages. Pour utiliser le filtre « facultatif », vous devez utiliser CASE pour construire une expression booléenne qui gère correctement l'attribut « facultatif ». En règle générale, cela peut être fait de manière plus sophistiquée en utilisant CASE, comme ceci :

    case when @num = 1 and p.merchant_name <> @query then 0 else 1 end = 1

    Donc CASE est utilisé ici pour renvoyer une valeur qui peut être testée dans la comparaison. Il n'y a rien de magique à utiliser 0 ou 1. Utilisez n’importe quelle valeur de n’importe quel type.

    • Lorsque @num vaut 1 et que les valeurs ne correspondent pas, retournez ALORS branche (0).
    • Lorsque @num vaut 1 et que les valeurs correspondent, renvoie la branche ELSE (1).
    • Lorsque @num n'est pas 1, renvoie la branche ELSE (1).

    Ainsi, lorsque l'expression CASE renvoie 0 (pas réellement 1), la ligne est ignorée (supprimée du jeu de résultats).

    Étant donné que votre requête est réellement construite au sein de l'application, vous devriez envisager de créer la requête de manière dynamique et d'ajouter des paramètres si nécessaire. Cela peut aboutir à une requête plus efficace que le moteur de base de données peut mieux optimiser. Alternativement, vous pouvez consulter cette Discussion sur l'évier de cuisine et la discussion d'Erland sur les Critères de recherche dynamiques. TBH ressemble à quelqu'un qui a utilisé @num comme un patchwork pour éviter d'ajouter des paramètres pour huit valeurs de filtre spécifiques. Si je souhaite filtrer à la fois le nom du commerçant et le nom du magasin, je ne peux pas utiliser cette méthode.

    répondre
    0
  • Annulerrépondre