web-dev-qa-db-fra.com

Comment interrogez-vous une colonne int pour une valeur?

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.

16
Bill

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)
38
Mark Brackett

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%'.

6
CaptainBli

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.

3
Dave Carlile

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.

1
driis

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.

1
Bob Jarvis

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.

1
Widor

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 
1
bfavaretto