programing

sql server에 ISNULL과 반대되는 기능이 있습니까?작업이 null이 아닙니까?

telebox 2023. 8. 20. 10:45
반응형

sql server에 ISNULL과 반대되는 기능이 있습니까?작업이 null이 아닙니까?

내 선택 문에 이 코드가 있습니다.

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

하지만 "a"가 맞는지 확인하고 싶습니다.정책 서명 날짜"가 null이 아닙니다."if" 문을 사용하지 않는 쉬운 기능이 있습니까?

건배!

사용해야 합니다.CASE

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

늦었다는 것은 알지만 만약 다른 사람이 이것을 보고 MSSQL 2012 이상을 사용한다면 당신은 '을 사용할 수 있습니다.IIF의 진술.

OP는 '를 사용하고 싶지 않은 것 같습니다.IF'clause 원인은 단순한 것을 완성하기에는 "너무 많은 코드 구문"입니다.

'보다 깨끗한 대안도 있습니다.IF' 문은 'IIF'입니다.인라인일 뿐입니다.IF의 단순화.

SELECT IIF(X IS NULL, 'Is null', 'Not null') 'Column Name'

OP에 대하여

SELECT IIF(a.PolicySignedDateTime IS NULL, NULL, aq.Amount) AS 'Signed Premium'

https://learn.microsoft.com/en-us/sql/t-sql/functions/logical-functions-iif-transact-sql?view=sql-server-ver15

제가 보기에 이것은 그 반대를 쉽게 할 수 있는 방법인 것 같습니다.

선택(1-ISNULL(필드));

NULL이 아닌 경우 1을 제공하고 NULL이 아닌 경우 0을 제공합니다. NULL이 아닌 경우 0을 제공합니다.

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

사용해 보십시오.

선택한다.사례.어떤 경우에.정책 서명 날짜 시간이 null이 아닙니다.정책 서명 날짜 시간그 외에는.조인된 테이블에서

하지만.. ISNULL(a)입니다.정책 서명 날짜 시간, q.금액) 필드가 null인지 확인합니다. 따라서 null이 아니므로 값을 얻습니다.

그래서 당신이 다른 방법을 사용하기를 원하기 때문에 저는 잘 이해하지 못합니다.

반대의 기능은 없지만 당신은 그것을 할 수 있습니다.CASE.

문자열이 NULL이면 문자열 + 'something'이 NULL이 된다는 사실을 사용하고, 문자열이 NULL이면 ISNULL을 사용하여 'somethingother'를 반환하고, RIGHT()로 반환된 값의 끝을 가져와서 NULLIF를 사용하여 'something'에 대해 확인한 다음, 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 환경에 있기 때문에, 세트 기반 접근법을 사용하는 것이 가능합니다.따라서 테이블에 null이 아닌 기본 키 또는 고유한 식별자 필드(id)가 있다고 가정하면 작업을 다음과 같이 수행할 수 있습니다.

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

값 필드가 문자 데이터 유형인 경우 일부 문자 함수를 사용해야 합니다.따라서 접근 방식의 실질적인 구현은 다음과 같습니다.

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

NOT NULL 부호를 1 형식으로 가져오는 또 다른 옵션은 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'

null(nullif(isnull(@Num,0)),@Num,1)

null의 경우 0, null이 아닌 경우 1

언급URL : https://stackoverflow.com/questions/19242782/is-there-a-opposite-function-to-isnull-in-sql-server-to-do-is-not-null

반응형