Comment pouvez-vous interroger une colonne pour une valeur quelconque dans cette colonne? (c.-à-d. comment construire une clause where dynamique qui peut filtrer la valeur ou non.)
Je veux pouvoir interroger une valeur spécifique ou non. Par exemple, je pourrais vouloir que la valeur soit 1, mais je pourrais vouloir que ce soit n'importe quel nombre.
Existe-t-il un moyen d'utiliser un caractère générique (comme "*"), pour faire correspondre n'importe quelle valeur, afin qu'il puisse être inséré dynamiquement là où je ne veux pas de filtre?
Par exemple:
select int_col from table where int_col = 1 // Query for a specific value
select int_col from table where int_col = * // Query for any value
La raison pour laquelle je ne souhaite pas utiliser 2 instructions SQL distinctes est que je l'utilise en tant que source de données SQL, qui ne peut comporter qu'une seule instruction select.
Parfois, j'interroge la valeur réelle (comme 1, 2 ...) afin que je ne puisse pas non plus avoir de condition.
Je suppose que vous voulez un comportement dynamique sur votre clause WHERE
, sans avoir à dynamiser build votre clause WHERE
.
Avec un seul paramètre, vous pouvez utiliser ISNULL
(ou COALESCE
) comme ceci:
SELECT * FROM Table WHERE ID = ISNULL(@id, ID)
qui permet à un paramètre NULL
de correspondre à tous. Certains préfèrent le plus long mais le plus explicite:
SELECT * FROM Table WHERE (@id IS NULL) OR (ID = @id)
Une réponse simple serait utiliser: IS NOT NULL. Mais si vous demandez, par exemple, 123 * pour des nombres tels que 123456, 1234 ou 1237, vous pouvez le convertir en varchar, puis le tester à l’aide de caractères génériques standard.
Dans votre clause where: cast(myIntColumn as varchar(15)) like '123%'
.
En supposant que la valeur que vous filtrez soit un paramètre dans une procédure stockée, ou contenue dans une variable appelée @Value
, vous pouvez le faire comme ceci:
select * from table where @Value is null or intCol = @Value
Si @Value
est null, la partie or
de la clause est ignorée et la requête ne filtrera donc pas sur intCol.
Vous pouvez utiliser le paramètre comme caractère générique en attribuant une signification spéciale à NULL:
DECLARE @q INT = 1
SELECT * FROM table WHERE IntegerColumn = @q OR @q IS NULL
De cette façon, lorsque vous passez à NULL; vous obtenez toutes les lignes.
Si NULL est une valeur valide à interroger, vous devez utiliser deux paramètres.
Si vous voulez vraiment la valeur de votre colonne pour toutes les lignes de la table, vous pouvez simplement utiliser
select int_col
from table
Si vous voulez connaître toutes les valeurs distinctes sans vous soucier du nombre de fois qu'elles se répètent, vous pouvez utiliser
select distinct int_col
from table
Et si vous voulez connaître toutes les valeurs distinctes et combien de fois elles apparaissent, utilisez
select int_col, count(*)
from table
group by int_col
Pour que les valeurs soient correctement triées, vous pouvez ajouter
order by int_col
à toutes les questions ci-dessus.
Partager et profiter.
Les comparateurs sont l'équivalent des caractères génériques pour les nombres.
Donc, si vous voulez trouver tous les entiers positifs:
select int_col from table where int_col > 0
tout nombre compris entre cent et mille:
select int_col from table where int_col BETWEEN 100 AND 1000
etc.
Je ne comprends pas bien ce que vous demandez. Je pense que vous devriez utiliser deux requêtes différentes pour les différentes situations que vous avez.
Lorsque vous ne recherchez pas une valeur spécifique:
SELECT * FROM table
Lorsque vous recherchez une valeur spécifique:
SELECT * FROM table WHERE intcol = 1