J'essaie de faire quelque chose comme ceci:
An expression of non-boolean type specified in a context where a condition is expected, near ORDER.
6 Réponses :
Ceci est la requête dont vous avez besoin éditer:
Vous pouvez détendre des filtres ajoutant est NULL code> chèques si une colonne est null, nullif (@ expr1, @ expr2) code > Pourrait être réécrit comme suit: p> ou code> dans la clause "où" (Astuce: N'oubliez pas et code> est évalué avant ou code>) p> create proc my_proc @var AS varchar(100) = 'NULL§159§' -- this defaults to null, if you put a parameter it queries with parameter passed
as
select
col_1, col_2, etc
from
table
where
WHERE coalesce(col_1,'NULL§159§') = @var
-- added §159§ symbol to the null to make sure the queried string is impossible in the database,
-- obviously into the database the value 'NULL159' hase become a sort of 'reserved word', but hopefully is odd enough not to appear in data
GO
Parfois, c'est null, parfois ce n'est pas le cas. Je dois être capable de gérer les deux cas.
Votre question indique que «Mes résultats attendus sont de récupérer chaque enregistrement où Col_1 est null.» I> @LunchBox; Ceci est exactement b> quelle est cette réponse.
mettre des données d'échantillonnage et la sortie souhaitée pour que nous comprenais ce que vous avez vraiment besoin car, selon ce que vous demandez actuellement que c'est la réponse.
@Larnu Ce bit de la modification de l'opération contredit le contenu original Je sais que je peux utiliser où col_1 est null, mais j'utilise SSIS et une variable. Parfois, le col_1 est en réalité nul et parfois ce n'est pas le cas. Code> (ce qui ne donne aucun sens pour moi) I> jusqu'à ce que le PO élabore à ce sujet, tout le reste est supposé et devine du travail.
Laissez-moi essayer ce DDS, une seconde
L'utilisation d'un SP pour encapsuler le comportement est une expérience décente. Mais, comme écrit, l'argument par défaut provoquera toujours que le SQL ne renvoie aucun enregistrement. (j'utiliserais un si code> pour avoir une deuxième requête avec où col_1 est null code>, d'autres peuvent avoir une seule requête avec où col_1 = @ var ou (col_1 est null et @var est null) code>) i>
J'ai édité mon message en utilisant une idée de votre solution. Je reçois des erreurs, mais je sens que nous sommes plus proches.
@DDS - C'est une approche dangereuse. Il suppose (éventuellement correctement, mais même alors cela peut échouer à l'avenir) i> que Col1 n'inclut jamais la valeur 'null' code>. Si cela inclut jamais cette valeur, vous obtiendrez de faux matchs positifs.
Vrai, ajouté du hasard à la chaîne (et une explication de ce qui est fait)
Vous n'avez pas besoin du hasard, il suffit d'utiliser où col_1 = @var ou (col_1 est null et @var est null) code>
Correct, mais c'est, à mon avis, trop verbeux et plus difficile à comprendre.
L'exactitude, la robustesse, la maintenabilité et la performance sont toutes compromises par votre choix. Si 25 ans de codage m'ont appris quelque chose, c'est que les hacks pour la concision sont toujours des hacks et qu'ils se rendent toujours en arrière et vous mordent d'une manière ou d'une autre. Mais c'est ta réponse.
Vous pouvez faire quelque chose comme
Je veux 1 ou l'autre, mais pas les deux.
Essayez ceci, il peut gérer la colonne avec des valeurs nulelles ou un espace vide
La logique booléenne est la meilleure façon de gérer les choses dans le où code>. Cela pourrait avoir des problèmes de performance (graves) tels que nullif code> et isnull code> rendra la requête non sargable.
Intéressant. Si je remplace le "1" par "C'était une valeur null", cela ne fonctionne pas, mais cela fait avec "1".
Il n'a pas besoin de dire 1 ou l'autre, j'étais juste curieux.
select
col_1, col_2, etc
from
table
where
collaboration IS NULL OR collaboration ='Production'
Veuillez ajouter quelques informations pour expliquer comment cela résout le problème. Merci!
temps de la boule de cristal de moi. Ceci est ma supposition sur ce que l'OP veut:
DECLARE @Prod varchar(15);
--SET @Prod = 'Production';
SELECT {Columns}
FROM YourTable
WHERE Col1 = @Prod
OR (Col1 IS NULL AND @Prod IS NULL);
Essayez ceci.
Quelles sont vos données et vos résultats attendus?
Qu'essayez-vous de faire? Avez-vous regardé le Documentation sur la façon d'utiliser NULLIF ()?
col_1 = nullif ('', '') code> serait identique àcol_1 = null code>, qui ne va jamais retourner vrai; Comme rien n'est égal ànull code> (y comprisnull code>).Documentation:
renvoie une valeur null si les deux expressions spécifiées sont égales. Code>Sélectionnez Col_1, Col_2, etc. de la table où Col_1 est NULL
Vous déclarez savoir que vous pouvez utiliser
où col_1 est null code>, mais je ne comprends pas pourquoi vous n'êtes pas. S'il vous plaît montrer le cas réel dans les SSIS où l'existence d'une variable vous empêche de le faire.Ignorer Nullif, utiliser et / ou à la place dans la clause WHERE.
Si vous pouvez nous donner quelques échantillons de données et des résultats attendus, ce serait beaucoup plus facile.
J'ai édité mon post pour le faire, laissez-moi savoir si vous avez des questions.
Vous recherchez une requête paramétrée alors? Ce n'est toujours pas clair
On dirait que vous essayez d'écrire
où col1 = @variable ou (col1 est null et @variable = '') code> ou quelque chose de similaire. Cela a une pénalité de performance cependant. Il vaut mieux que votre paquet SSIS écrive deux requêtes différentes. Une requête pour quand vous souhaitez que les NULLS et une requête séparée pour quand vous souhaitez faire correspondre la variable. De cette façon, chaque requête peut avoir son propre plan d'exécution, en effectuant une utilisation active d'index appropriés, plutôt que d'essayer de former un plan d'exécution complexe pour répondre à deux exigences, compromettant sa capacité à être optimale pour l'une ou l'autre des circonstances.@Matbailie Je ne suis pas sûr que ça aurait tellement. Le problème tire plus lorsque vous avez une "requête de capture-toutes" comme
où colonne = @var ou @var est null code>, cependant, efficacement, l'OP semble vouloir vouloir avoirnull = null < / code> logique; qui n'aura pas les mêmes préoccupations.@larnu dans mon expérience, même un
Union Tout code> des deux requêtes plus simples sera plus rapide, même dans ce cas plus simple.