2 votes

Conditions de recherche par rapport à la comparaison

Je comprends que WHERE 1 = '1' retourne vrai, et aussi WHERE 222 = CONVERT(varchar, 222) retournera vrai en T-SQL.

Mais, lorsqu'on travaille avec IN, l'expression_test et la sous-requête peuvent-elles être de types de données différents ? Par exemple, l'expression_test peut-elle être un int, et la sous-requête un varchar ?

0voto

gbn Points 197263

Il peut s'agir de : tous les types de données seront convertis au plus haut niveau basé sur " précédence du type de données règles ".

Logiquement, x in (a,b,c) est en fait x=a or x=b or x=c bien sûr. Ceci est pertinent pour ce cas inventé utilisant des valeurs scalaires. I Je ne sais vraiment pas si toutes les valeurs sont CAST en float (la plus élevée ici) avant la comparaison ( ..IN.. ) ou par comparaison ( ..OR..OR.. )

WHERE
  CAST(1 AS int) IN ('1', CAST(1.0 AS float), 1.0 /*decimal*/)

Pour une sous-requête dans la clause IN, alors la clause colonne a un type de données qui sera CAST selon les règles scalaires

Editer, après le commentaire :

Tous les types de données seront implicitement CAST

SELECT TOP 1 *
FROM sys.columns
WHERE
    1 IN (SELECT CAST('1' AS CHAR(1)) FROM sys.columns)

o

DECLARE @intvar int = 1, @charvar char(1) = '1';

SELECT TOP 1 *
FROM sys.columns
WHERE
    @intvar IN (SELECT @charvar FROM sys.columns)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X