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
Vous devez utiliser CASE
SELECT CASE WHEN Field IS NOT NULL
THEN 'something'
ELSE 'something else'
END
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.
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.
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
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'