0
votes

Nulls étant exclus lors du filtrage de la chaîne littéral

J'ai la requête ci-dessous où j'avais l'intention de filtrer / exclure où code> soit le type de plage ou le concept de marché est égal au "espace porteur" littéral. Nous avons trouvé en raison de la rétroaction que nous excluons également toute instance où ces champs sont null code>. C'était une certaine surprise pour moi, tout conseil sur la façon d'expliquer?

Query: P>

SELECT DISTINCT M.MATERIAL, 
       A.MARKET_CONCEPT, 
       A.RANGE_TYPE
FROM VW_MRP_ALLOCATION_COMBINED M
JOIN VW_ARTICLE_ATTRIBUTES_COMBINED A ON M.Material = A.Article AND M.SALES_ORGANIZATION = A.SALES_ORGANIZATION
WHERE M.stock_type = '' 
AND A.market_concept <> 'PLACEHOLDER'
AND A.RANGE_TYPE <> 'PLACEHOLDER' 
AND A.Article in ('BK0348',
'BQ2718',
'BQ2719',
'BS3674',
'CF3607',
'CF3608',
'CF3609',
'CF3610',
'CV5091',
'D94751',
'DH6911',
'DT5039')
AND M.Sales_Organization = 6040; 


5 commentaires

Les nulls sont l'absence de valeur, ce ne sont pas des chaînes vides. Si vous souhaitez inclure une valeur NULL, vous pouvez utiliser {quelqueValue} est null


Par définition null est une valeur inconnue et ne peut donc pas être égale ou non égale. Si vous souhaitez inclure des valeurs null, vous devez les inclure spécifiquement par ex. (A.Market_Concept <> 'Placeholder' ou A.Market_Concept est NULL)


Cela sonne des cloches. Que se passerait-il si j'ai changé la condition en "comme" au lieu d'un égal ou non égal à un égal ou non? Cela ne semble toujours pas fonctionner


Même accord .... vous pouvez faire coalesce (a.market_concept, '') <> "espace réservoir" mais il ne fonctionnera pas aussi bien que la solution que j'ai donnée ci-dessus parce que vous utilisez un fonctionner sur la valeur avant de le comparer,.


La même chose s'applique, NULL est toujours false


3 Réponses :


2
votes

Les enregistrements NULL sont dessinés à l'aide du mot-clé "IS NULL" de comparaison. Voici un exemple de la manière dont vous pouvez obtenir des enregistrements NULL

with data
  as (select 'PLACEHOLDER' as market_concept,'PLACEHOLDER' as range_type
      union all
      select 'MarketConcept1' as market_concept,'Rangetype1' as range_type
      union all
      select null as market_concept, null as range_type
      )
 select *
 from data
 where ((market_concept <> 'PLACEHOLDER'
         and range_type <>'PLACEHOLDER'
         )
      --This OR condition brings out the records which are null
      OR(market_concept is null
         and range_type is null
         )
       )

+----------------+------------+
| market_concept | range_type |
+----------------+------------+
| MarketConcept1 | Rangetype1 |
| null           | null       |
+----------------+------------+


2 commentaires

Cela suppose que les deux colonnes soient nécessaires pour être nuls ensemble ensemble? Et si seulement un nul?


J'ai supposé être basé sur la requête PO partagée. une seule nulle sur les deux champs serait (Market_Concept est NULL ou RANGER_TYPE est NULL)



1
votes

Vous pouvez utiliser une fonction ISNULL pour considérer la valeur null identique à celle de l'espace réservé.

SELECT DISTINCT M.MATERIAL, 
       A.MARKET_CONCEPT, 
       A.RANGE_TYPE
FROM VW_MRP_ALLOCATION_COMBINED M
JOIN VW_ARTICLE_ATTRIBUTES_COMBINED A ON M.Material = A.Article AND M.SALES_ORGANIZATION = A.SALES_ORGANIZATION
WHERE M.stock_type = '' 
AND ISNULL(A.market_concept,'PLACEHOLDER') <> 'PLACEHOLDER'
AND ISNULL(A.RANGE_TYPE,'PLACEHOLDER') <> 'PLACEHOLDER' 
AND A.Article in ('BK0348',
'BQ2718',
'BQ2719',
'BS3674',
'CF3607',
'CF3608',
'CF3609',
'CF3610',
'CV5091',
'D94751',
'DH6911',
'DT5039')
AND M.Sales_Organization = 6040; 


0 commentaires

2
votes

Je suggérerais d'être explicite: xxx

Remarque: cela suppose que 'Code' n'est pas null . Si cela est possible, je suggérerais de poser une nouvelle question, avec des données d'échantillonnage claires et des résultats souhaités.


0 commentaires