Existe-t-il un moyen de n'utiliser que des SELECT
lignes contenant certaines données dans une colonne WHERE
?
Par exemple, si j'avais ceci:
SELECT * FROM Users
WHERE town = 'Townsville'
existe-t-il un moyen de mettre en œuvre la WHERE
clause dans la SELECT
déclaration?
quelque chose comme
SELECT *, town('Townsville') FROM Users
C'est une question bizarre mais c'est celle que mes pairs m'ont posée
sql-server
Josh Stevenson
la source
la source
Réponses:
Je ne sais pas si c'est le genre de chose folle que vous recherchiez ....
Avertissement : Je n'ai absolument aucune idée de la raison pour laquelle vous souhaitez utiliser cela.
la source
Les données
Solutions alternatives
Conservation des doublons
Production:
Pour le dernier exemple:
Essayez-le ici: Stack Exchange Data Explorer
la source
GROUP BY
solutions, vous pouvez également ajouter le PK dans la liste group by (pour être sûr à 100% que les requêtes renvoient le même nombre de lignes que le WHERE). En supposant bien sûr qu'il existe un PK;)Autrement.
( Réutilisation des données d'exemple de Paul White )
la source
"Juste pour le plaisir", vous pouvez utiliser un
order by
avectop(1) with ties
Cela ordonnera toutes les lignes en
Townsville
premier puisque le cas retourne1
iftown = 'Townsville'
. Toutes les autres lignes auront un2
retour par le cas.La
with ties
clause oblige la requête à renvoyer toutes les lignes qui sont un "lien" pour la dernière place dans les lignes renvoyées. L'utilisationtop(1)
en combinaison avecwith ties
retournera alors toutes les lignes qui ont la même valeur que la première ligne dans l'expression utilisée dans la clause order by.Notez, comme Martin Smith l'a souligné dans un commentaire, il retournera toutes les lignes si vous demandez une ville qui n'existe pas dans le tableau.
Si vous ne craignez pas les choses XML des bases de données, vous pouvez utiliser un prédicat dans la fonction nodes ().
Emprunter l'installation de Paul White.
Une autre version avec
top
etorder by
qui fonctionne réellement lors de la recherche de villes non existantes.la source
Vous avez deux choses différentes ici.
Limitera le nombre de lignes que vous récupérez à celles où town =
Townsville
Va passer le littéral
Townsville
à une fonction appeléetown
. Cela ne restreindra pas les lignes renvoyées par la requête et, en fait, si la fonction renvoie autre chose qu'une seule valeur, vous obtiendrez une erreur.Il existe d'autres façons de limiter le nombre de lignes que vous récupérez d'une requête. La clause HAVING par exemple. Mais il a plusieurs autres exigences.
Ou un INNER JOIN bien que celui-ci soit un peu bizarre si vous n'avez pas de deuxième table.
la source
Voici un exemple utilisant une expression de table commune (CTE).
la source
Eh bien, vous pouvez le faire:
À strictement parler, vous n'utilisez pas la clause WHERE
la source
Voici une façon
idiotetout à fait logique de le faire que je ne vois pas encore ....Je ne peux pas imaginer pourquoi ce n'était pas la première chose à suggérer. :)
la source
Toutes les villes, à l'exception de Townsville, seraient nulles. Problème résolu.
la source