2010-03-03 2 views
2

Je suis convaincu que cela va me faire me gifler quand je vois la réponse, mais ici va ...Comment obtenir certains résultats de la requête SQL en haut de la liste

dire que je besoin d'une liste de tous les produits de un certain fournisseur mais ils ont besoin de commander par une variable spécifique productType en haut et en dessous cela n'a pas vraiment d'importance mais tous les produits doivent être dans la liste.

Donc, fondamentalement

SELECT * FROM Products p WHERE p.VendorID = 1 AND p.ProductType = 'widget' 

les premières lignes à afficher. Ensuite,

SELECT * FROM Products p WHERE p.VendorID = 1 AND p.ProductType <> 'widget' 

en dessous de cela.

J'utilise LINQ si cela aide tout mais je ne peux même pas cela dans SQL régulièrement des requêtes

+0

Et cela ne fonctionne pas? Qu'essayez-vous exactement d'accomplir? – ehdv

+0

Quand je les unit, il ne maintient pas l'ordre avec la première requête en haut. C'est aussi un exemple simplifié d'une requête beaucoup plus grande. – HighHat

Répondre

4

Dans Sql :

SELECT * 
FROM Products p 
WHERE p.VendorID = 1 
ORDER BY CASE WHEN p.ProductType = 'widget' THEN 1 ElSE 2 END 

Et Linq:

IQueryable<Product> query = 
    from p in dc.Products 
    where p.VendorID == 1 
    orderby p.ProductType == "widget" ? 1 : 2 
    select p; 
+0

Linq utilise des guillemets – StriplingWarrior

+0

Merci, l'a écrit dans l'analyseur de requête de sorte qu'il semblait ok. :) Edité. –

+0

Nice - merci pour le Linq aussi! – HighHat

2

Créer un champ supplémentaire dans la partie de sélection qui indique si elles doivent être au-dessus. Par exemple.

SELECT *, (p.ProductType = 'widget') AS thisfirst FROM Products p WHERE p.VendorID = 1 ORDER BY thisfirst 
+0

Cela ne fonctionnera pas dans SQL Server et de nombreux dbs. Vous devez utiliser une fonction Case (ou si Access (bleh), une fonction IIF). – Thomas

+0

Sur SqlServer je reçois - Syntaxe incorrecte près de '='. –

+0

Pour mysql cela me semble correct (ne l'ai pas couru cependant). http://dev.mysql.com/doc/refman/5.0/fr/comparison-operators.html#operator_equal Bien sûr, avec un si ou un cas, vous pouvez faire la même chose. – Thirler

1

ordre juste par une déclaration de cas comme ceci:

select * from products 
order by case producttype when 'widget' then 1 end nulls last; 
3

Une option est:

SELECT *, 
     CASE p.ProductType WHEN 'widget' THEN 0 ELSE 1 END AS ProductPriority 
    FROM Products p 
    WHERE p.VendorID = 1 
    ORDER BY ProductPriority 
+0

Cela a bien fonctionné, mais je ne peux choisir qu'une seule réponse. Merci. – HighHat

+0

Pas de problème. Je pense que vous avez choisi la bonne réponse (j'ai voté l'autre réponse). – Brian

1

Je suppose que vous utilisez LINQ to SQL, donc je pense qu'il serait préférable de le faire en utilisant une requête LINQ:

db.Products 
    .Where(p => p.VendorID == 1) 
    .OrderBy(p => p.ProductType == 'widget') 
1

Une autre approche de Brian serait une requête syndicale:

Select ... 
From (
     Select ..., 0 As SortOrder 
     from Products 
     Where VendorId = 1 
      And ProductType = 'Widget' 
     Union All 
     Select ..., 1 
     from Products 
     Where VendorId = 1 
      And ProductType <> 'Widget' 
     ) As Z 
Order By Z.SortOrder 
+0

Je suis d'accord - l'utilisation de UNION est simple et permet l'utilisation de clauses ORDER BY possibles. –

+0

Cela entraîne deux accès à la table Produits lorsqu'un seul est requis. Si la table est grande, cela ne fonctionnera pas bien. –

+0

Cette requête exclura les lignes dans lesquelles ProductType est null. –

Questions connexes