私の選択ステートメントにこのコードがあります
ISNULL(a.PolicySignedDateTime,aq.Amount) AS 'Signed Premium',
しかし、「a.PolicySignedDateTime」がnullでないかどうかを見たいです。 「if」ステートメントを使用せずにこれを行う簡単な機能はありますか?
乾杯
CASE
を使用する必要があります
SELECT CASE WHEN Field IS NOT NULL
THEN 'something'
ELSE 'something else'
END
COALESCE式があります(関数ではありません https://msdn.Microsoft.com/en-us/library/ms190349.aspx )引数を順番にテストし、値が見つからないまでそれを続けますNULLを返します。
使用例:SELECT COALESCE(NULL, NULL, 5)--returns 5
あなたの場合:COALESCE(a.PolicySignedDateTime,aq.Amount) AS 'Signed Premium',
これを試して:
SELECT CASE いつa.PolicySignedDateTime IS NOT NULL THEN a.PolicySignedDateTime ELSE aq.Amount 参加したテーブルから
しかし.... ISNULL(a.PolicySignedDateTime、aq.Amount)フィールドがnullかどうかを確認します。nullではない場合、その値を取得します。
あなたは別の方法を使用したいので、私は本当に理解していません。
反対の機能はありませんが、CASE
なしで実行できます。
文字列がNULLの場合、文字列+ 'something'がNULLになるという事実を使用し、それがnullの場合、ISNULLを使用して 'somethingelse'を返し、RIGHT()で戻り値の終わりを取得し、それを使用して 'something'に対してチェックしますNULLIF、そしてCOALESCEを使用して、NULL(元の値がNULLではないことを意味する)の場合に実行したいことを行います。
例:
declare @text varchar(20) = 'some text or value'
select COALESCE(NULLIF(RIGHT(ISNULL(@text + 'NOT', 'IS ') + 'NULL', 7), 'NOTNULL'), 'NOT NULL')
このコードを試してみてください。また、@ textの値なしで試してください。
以降 DBMS環境にいるため、セットベースのアプローチを使用できます。そのため、テーブルに識別子フィールド(id)-主キーまたは一意であり、nullがないと仮定すると、ジョブは次のように実行できます。
SELECT numeric_field * count(flag_field) AS not_null_flag_numeric_value_or_zero
FROM my_table
GROUP BY id, numeric_field
値フィールドが文字データ型の場合、char関数を使用する必要があります。そのため、アプローチの実際の実装は次のようになります。
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
別の 1の形式でNOT NULL符号を取得するオプションは、flag_field値のビットへの変換を使用することです。
... cast(flag_field as bit) ...
これは、flag_fieldデータ型でビットへの変換が使用可能な場合に機能し、0値とNULLを同じNO VALUEと見なすことができる場合に役立ちます。 NULLまたは0で表されます-選択したとおり:
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
またはXORがフォーカスされている場合:
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'