web-dev-qa-db-ja.com

SQLサーバーにはISNULLの反対の機能がありますか?ヌルではない?

私の選択ステートメントにこのコードがあります

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

しかし、「a.PolicySignedDateTime」がnullでないかどうかを見たいです。 「if」ステートメントを使用せずにこれを行う簡単な機能はありますか?

乾杯

32
Bobby

CASEを使用する必要があります

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

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',

2
user6434940

これを試して:

 SELECT 
 CASE 
いつa.PolicySignedDateTime IS NOT NULL THEN a.PolicySignedDateTime 
 ELSE aq.Amount 
参加したテーブルから

しかし.... ISNULL(a.PolicySignedDateTime、aq.Amount)フィールドがnullかどうかを確認します。nullではない場合、その値を取得します。

あなたは別の方法を使用したいので、私は本当に理解していません。

1
Joe Taras

反対の機能はありませんが、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の値なしで試してください。

0
Oakgrove

以降 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
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

または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'
0
Mattias Persson