web-dev-qa-db-fra.com

Y at-il une fonction opposée à ISNULL dans le serveur SQL? Faire n'est pas nul?

J'ai ce code dans ma déclaration choisie

ISNULL(a.PolicySignedDateTime,aq.Amount) AS 'Signed Premium',

Mais je veux voir si "a.PolicySignedDateTime" n'est pas null. Y a-t-il une fonction facile à faire qui n'implique pas l'utilisation d'une instruction "if"?

Acclamations gars

30
Bobby

Vous devez utiliser CASE

SELECT CASE WHEN Field IS NOT NULL
    THEN 'something'
    ELSE 'something else'
END
32
Szymon

Essaye ça:

SÉLECTIONNER
 CAS
 WHEN a.PolicySignedDateTime IS PAS NULL ALORS a.PolicySignedDateTime 
 ELSE aq.Amount 
 FROM votre table jointe 

Mais .... ISNULL (a.PolicySignedDateTime, aq.Amount) vérifie si votre champ est null, ce qui signifie que vous obtenez sa valeur.

Donc, je ne comprends pas vraiment parce que vous voulez utiliser un autre moyen.

1
Joe Taras

Il n'y a pas de fonction opposée mais vous pouvez le faire sans CASE.

Utilisez le fait qu'une chaîne + 'quelque chose' sera NULL si la chaîne est NULL, et si c'est null, utilisez ISNULL pour renvoyer 'quelque chose', obtenez la fin de la valeur renvoyée avec RIGHT () et comparez cela avec 'quelque chose' à l'aide de NULLIF, puis utilisez COALESCE pour faire ce que vous voulez faire si c'est NULL (ce qui signifie que la valeur d'origine n'est pas nulle).

Exemple:

declare @text varchar(20) = 'some text or value'

select COALESCE(NULLIF(RIGHT(ISNULL(@text + 'NOT', 'IS ') + 'NULL', 7), 'NOTNULL'), 'NOT NULL')

Essayez ce code et essayez-le également sans valeur pour @text.

0
Oakgrove

Puisque nous sommes dans un environnement de SGBD, il est possible d'utiliser une approche basée sur les ensembles. Donc, en supposant que cette table ait un champ identifiant (id) - clé primaire ou unique et non nul, le travail peut être effectué de cette façon:

SELECT numeric_field * count(flag_field) AS not_null_flag_numeric_value_or_zero
FROM my_table
GROUP BY id, numeric_field 

Si le champ value est de type caractère, utiliser une fonction char. Ainsi, la mise en œuvre pratique de l'approche pourrait être comme suit:

SELECT * INTO #temporary_table 
FROM 
  (VALUES 
    (1, 1, 111, 'string_1'),
    (2, NULL, 222, 'string_2')
  ) data_table(id, flag_field, numeric_field, character_field)

ALTER TABLE #temporary_table ADD CONSTRAINT tab_pk PRIMARY KEY (id)

SELECT 
  count(flag_field) AS is_not_null,
  numeric_field * count(flag_field) AS numeric_value_or_zero,
  numeric_field * nullif(count(flag_field), 0) AS numeric_value_or_null,
  left(character_field, len(character_field) * count(flag_field)) AS character_value_or_empty,
  stuff(character_field, nullif(count(flag_field), 0), 0, '') AS character_value_or_null
FROM #temporary_table
GROUP BY id, numeric_field, character_field

--DROP TABLE #temporary_table

Une autre option pour obtenir une connexion NOT NULL sous la forme 1 consiste à utiliser la conversion de la valeur de flag_field en bit:

... cast(flag_field as bit) ...

Cela fonctionne lorsque la conversion en bit est disponible pour votre type de données flag_field et est utile lorsque vous pouvez considérer les valeurs 0 et NULL comme étant identiques à NO VALUE. Représenté par NULL ou 0 - à votre choix:

SELECT 
  nullif(cast(flag_field as bit), 0) AS is_not_null_or_null, 
  isnull(cast(flag_field as bit), 0) AS is_not_null_or_zero,
  numeric_field * nullif(cast(flag_field as bit), 0) AS value_or_null, 
  numeric_field * isnull(cast(flag_field as bit), 0) AS value_or_zero
FROM #temporary_table
0
nakonoro
CREATE FUNCTION ISNUL (@DATA sql_variant) RETURNS BIT AS 
  BEGIN
  IF (@DATA IS NULL) RETURN 1;
  RETURN 0
END

SELECT dbo.ISNUL(NULL) -- 1
SELECT dbo.ISNUL('123') -- 0
SELECT dbo.ISNUL(123) -- 0
SELECT dbo.ISNUL(123) ^ dbo.ISNUL(NULL), dbo.ISNUL('123') ^ dbo.ISNUL(NULL), dbo.ISNUL('123') ^ dbo.ISNUL(123), dbo.ISNUL(NULL) ^ dbo.ISNUL(NULL)  -- 1,1,0,0

Ou lorsque XOR est au point:

CREATE FUNCTION XOR (@D1 sql_variant, @D2 sql_variant) RETURNS BIT AS 
BEGIN
  IF (@D1 IS NULL AND @D2 IS NULL) RETURN 0;
  IF (@D1 IS NOT NULL AND @D2 IS NOT NULL) RETURN 0;
  RETURN 1
END

SELECT XOR(NULL,123), XOR('123',NULL), XOR(NULL,NULL), XOR('123',123)
SELECT 'TRUE' where XOR(NULL,123) = 'true'
SELECT 'FALSE' where XOR('123',123) = 'false'
0
Mattias Persson