Je veux vérifier les données mais les ignorer si elles sont nulles ou vides. Actuellement, la requête est la suivante ...
Select
Coalesce(listing.OfferText, company.OfferText, '') As Offer_Text,
from tbl_directorylisting listing
Inner Join tbl_companymaster company
On listing.company_id= company.company_id
Mais je veux obtenir company.OfferText si listing.Offertext est une chaîne vide, ainsi que si elle est nulle.
Quelle est la solution la plus performante?
Je pense que ce:
SELECT
ISNULL(NULLIF(listing.Offer_Text, ''), company.Offer_Text) AS Offer_Text
FROM ...
est la solution la plus élégante.
Et pour décomposer un peu en pseudo-code:
// a) NULLIF:
if (listing.Offer_Text == '')
temp := null;
else
temp := listing.Offer_Text; // may now be null or non-null, but not ''
// b) ISNULL:
if (temp is null)
result := true;
else
result := false;
SELECT
CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText
ELSE COALESCE(Company.OfferText, '') END
AS Offer_Text,
...
Dans cet exemple, si listing.OfferText
est NULL, la fonction LEN () doit également renvoyer NULL, mais ce n'est toujours pas> 0.
Mise à jour
J'ai appris certaines choses au cours des cinq années et demie qui ont suivi l'affichage de cette annonce, et le fais très différemment maintenant:
COALESCE(NULLIF(listing.OfferText,''), Company.OfferText, '')
Ceci est similaire à la réponse acceptée, mais il y a aussi un repli dans le cas où Company.OfferText
est également nul. Aucune des autres réponses actuelles utilisant NULLIF()
ne fait cela aussi.
Select
CASE
WHEN listing.OfferText is null or listing.OfferText = '' THEN company.OfferText
ELSE COALESCE(Company.OfferText, '')
END As Offer_Text,
from tbl_directorylisting listing
Inner Join tbl_companymaster company
On listing.company_id= company.company_id
Voici une autre solution:
SELECT Isnull(Nullif(listing.offertext, ''), company.offertext) AS offer_text,
FROM tbl_directorylisting listing
INNER JOIN tbl_companymaster company
ON listing.company_id = company.company_id
Vous pouvez utiliser ISNULL
et comparer la réponse à la sortie connue:
SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST
Dans SQL Server 2012, vous avez IIF
, par exemple, vous pouvez l'utiliser comme
SELECT IIF(field IS NULL, 1, 0) AS IsNull
De la même manière, vous pouvez vérifier si le champ est vide.
Utilisez la fonction LEN pour vérifier les valeurs nulles ou vides. Vous pouvez simplement utiliser LEN (@SomeVarcharParm)> 0. Cela retournera false si la valeur est NULL, '' ou ''. En effet, LEN (NULL) renvoie la valeur NULL et NULL> 0 renvoie la valeur false. De plus, LEN ('') renvoie 0. Voyez par vous-même:
SELECT
CASE WHEN NULL > 0 THEN 'NULL > 0 = true' ELSE 'NULL > 0 = false' END,
CASE WHEN LEN(NULL) > 0 THEN 'LEN(NULL) = true' ELSE 'LEN(NULL) = false' END,
CASE WHEN LEN('') > 0 THEN 'LEN('''') > 0 = true' ELSE 'LEN('''') > 0 = false' END,
CASE WHEN LEN(' ') > 0 THEN 'LEN('' '') > 0 = true' ELSE 'LEN('' '') > 0 = false' END,
CASE WHEN LEN(' test ') > 0 THEN 'LEN('' test '') > 0 = true' ELSE 'LEN('' test '') > 0 = false' END
Select
Coalesce(NullIf(listing.OfferText, ''), NullIf(company.OfferText, ''), '') As Offer_Text,
from tbl_directorylisting listing
Inner Join tbl_companymaster company
On listing.company_id= company.company_id
Cette combinaison simple de COALESCE et NULLIF devrait faire l'affaire:
SELECT
Coalesce(NULLIF(listing.OfferText, ''), company.OfferText) As Offer_Text
...
Remarque: ajoutez une autre chaîne vide comme dernier argument COALESCE si vous souhaitez que l'instruction renvoie une chaîne vide au lieu de NULL si les deux valeurs sont NULL.
Je sais que c'est un vieux fil, mais je viens de voir l'un des précédents messages ci-dessus et ce n'est pas correct.
Si vous utilisez LEN (...) pour déterminer si le champ est NULL ou EMPTY, vous devez l'utiliser comme suit:
...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...
Voici une solution, mais je ne sais pas si c'est la meilleure ....
Select
Coalesce(Case When Len(listing.Offer_Text) = 0 Then Null Else listing.Offer_Text End, company.Offer_Text, '') As Offer_Text,
from tbl_directorylisting listing
Inner Join tbl_companymaster company
On listing.company_id= company.company_id
cette syntaxe:
SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)
a travaillé pour moi dans Microsoft SQL Server 2008 (SP3)
SELECT
COALESCE(listing.OfferText, 'company.OfferText') AS Offer_Text,
FROM
tbl_directorylisting listing
INNER JOIN tbl_companymaster company ON listing.company_id= company.company_id
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0
Pour empêcher les enregistrements avec la valeur Empty
ou Null
dans le résultat SQL
nous pouvons simplement ajouter ..... WHERE Column_name != '' or 'null'