SQL Server의 IsNull () 함수에 해당하는 C #


113

SQL Server에서 IsNull()함수를 사용하여 값이 null인지 확인하고 null 인 경우 다른 값을 반환 할 수 있습니다. 이제 C #에 비슷한 것이 있는지 궁금합니다.

예를 들어 다음과 같이하고 싶습니다.

myNewValue = IsNull(myValue, new MyValue());

대신에:

if (myValue == null)
  myValue = new MyValue();
myNewValue = myValue;

감사.

답변:


204

이를 null 병합 ( ??) 연산자 라고합니다 .

myNewValue = myValue ?? new MyValue();

3
null-coalescing 연산자를 사용하려고했지만 연산자 '??' 오류가 계속 발생했습니다 . 'bool?'유형의 피연산자에는 적용 할 수 없습니다. 및 'int' . 오해의 소지가있는 오류입니다. 문제는 내가 오른쪽 피연산자 위치에 부울 변수에 int를 할당하려고한다는 것입니다. 에서로 변경 this.BinaryExists = vModel.BinaryExists ?? 0;해야했습니다 this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda 2011

14

안타깝게도 DBNull과 함께 작동하는 null 병합 연산자에 해당하는 것은 없습니다. 이를 위해서는 삼항 연산자를 사용해야합니다.

newValue = (oldValue is DBNull) ? null : oldValue;

15
Nitpick : 많은 곳에서 이것을 삼항 연산자라고합니다. 지금은 삼항 연산자가 하나 뿐이지 만 이름이 아니라 속성입니다. 정말 조건부 연산자입니다. C #이 또 다른 삼항 연산자를 얻는다면 혼란스러운 책이 많이있을 것입니다.
Jon Skeet

dbnull을 객체로 캐스팅 할 수 있습니다. ((object) oldValue ?? (object) DBNull.Value))
Jeremy Gray

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)((object)oldValue == null) ? (object)DBNull.Value : (object)oldValueRobert Rossney의 솔루션이 다루는 문제와 다른 점과 동일합니다.
Trisped

5
public static T isNull<T>(this T v1, T defaultValue)
{
    return v1 == null ? defaultValue : v1;
}

myValue.isNull(new MyValue())

이렇게하면 null이 아니고 필요하지 않은 new MyValue()경우에도 실행됩니다 myValue!!
S.Serpooshan dec

4

Equals 방법을 사용하십시오.

object value2 = null;
Console.WriteLine(object.Equals(value2,null));

이 답변은 OP가 요청한 것이 아닌 True 또는 False 만 반환합니다.
Culme

1

DB Null로 작업하기 위해 VB 애플리케이션을위한 무리를 만들었습니다. VB의 내장 Cxxx 함수와 비슷하기 때문에 Cxxx2라고 부릅니다.

내 CLR 확장 프로젝트에서 볼 수 있습니다.

http://www.codeplex.com/ClrExtensions/SourceControl/FileView.aspx?itemId=363867&changeSetId=17967


CodePlex의 모든 URL을 변경 한 것 같습니다. 시도해보십시오 : clrextensions.codeplex.com/SourceControl/changeset/view/…
Jonathan Allen

0

두 함수를 작성합니다.

    //When Expression is Number
    public static double? isNull(double? Expression, double? Value)
    {
        if (Expression ==null)
        {
            return Value;
        }
        else
        {
            return Expression;
        }
    }


    //When Expression is string (Can not send Null value in string Expression
    public static string isEmpty(string Expression, string Value)
    {
        if (Expression == "")
        {
            return Value;
        }
        else
        {
            return Expression;
        }
    }

그들은 아주 잘 작동합니다


2
이 코드 조각이 문제를 해결할 수는 있지만 질문에 대한 이유 또는 답변 방법은 설명하지 않습니다. 게시물의 품질을 향상시키는 데 도움이되는 코드에 대한 설명을 포함 해주세요 . 앞으로 독자를 위해 질문에 답하고 있으며, 해당 사용자는 코드 제안 이유를 모를 수 있습니다. 신고자 / 검토 자 : 이 답변과 같은 코드 전용 답변의 경우 반대 투표, 삭제하지 마세요!
Luca Kiebel

0

내 DataRow 유형에 다음 확장 방법을 사용하고 있습니다.

    public static string ColumnIsNull(this System.Data.DataRow row, string colName, string defaultValue = "")
    {
        string val = defaultValue;
        if (row.Table.Columns.Contains(colName))
        {
            if (row[colName] != DBNull.Value)
            {
                val = row[colName]?.ToString();
            }
        }
        return val;
    }

용법:

MyControl.Text = MyDataTable.Rows[0].ColumnIsNull("MyColumn");
MyOtherControl.Text = MyDataTable.Rows[0].ColumnIsNull("AnotherCol", "Doh! I'm null");

쿼리 결과에 해당 열에 대해 null이 아닌 값이 없으면 DataTable 개체가 해당 열을 제공하지 않기 때문에 먼저 열의 존재를 확인합니다.


0

아래 방법을 사용하십시오.

    /// <summary>
    /// Returns replacement value if expression is null
    /// </summary>
    /// <param name="expression"></param>
    /// <param name="replacement"></param>
    /// <returns></returns>
    public static long? IsNull(long? expression, long? replacement)
    {
        if (expression.HasValue)
            return expression;
        else
            return replacement;
    }

    /// <summary>
    /// Returns replacement value if expression is null
    /// </summary>
    /// <param name="expression"></param>
    /// <param name="replacement"></param>
    /// <returns></returns>
    public static string IsNull(string expression, string replacement)
    {
        if (string.IsNullOrWhiteSpace(expression))
            return replacement;
        else
            return expression;
    }

0
    public static T IsNull<T>(this T DefaultValue, T InsteadValue)
    {

        object obj="kk";

        if((object) DefaultValue == DBNull.Value)
        {
            obj = null;
        }

        if (obj==null || DefaultValue==null || DefaultValue.ToString()=="")
        {
            return InsteadValue;
        }
        else
        {
            return DefaultValue;
        }

    }

//This method can work with DBNull and null value. This method is question's answer

-10

질문이 약간 어리석기 때문에 이것은 농담의 절반을 의미합니다.

public static bool IsNull (this System.Object o)
{
   return (o == null);
}

이것은 확장 메서드이지만 System.Object를 확장하므로 이제 사용하는 모든 개체에 IsNull () 메서드가 있습니다.

그런 다음 다음을 수행하여 수많은 코드를 절약 할 수 있습니다.

if (foo.IsNull())

슈퍼 절름발이 대신 :

if (foo == null)

이것은 질문에 대한 답이 아닙니다.
Eric Schoonover

12
SQL Server의 ISNULL이 FlySwat에서 무엇을하는지 모릅니다.
ClayKaboom

1
아마도 이것은 C #에서 다르게 작동하지만 VB에서는 OP가 묻는 것처럼 개체가 null인지 테스트하는 데 작동하지 않는다는 것을 알고 있습니다. 나는 이것을 직접 시도했다. System.Object에 대한 확장을 만들었습니다. 문제는 확장 메서드가 작동 할 실제 Object개체 가 필요 하고 개체가 Nothing이면 (정확히이 Q에서 테스트하려는 경우) 확장 클래스가 작동 할 인스턴스가 없으므로 NullObject 예외가 발생합니다.
eidylon

@eidylon ObjectVB에서 확장 메서드에 액세스 할 수없는 것 같습니다 . 이 SO 질문 또는 이 블로그 게시물을 참조하십시오 .
Trisped
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.