sql >> データベース >  >> RDS >> Sqlserver

SQLServer2008の空の文字列とスペース

    varchar sと平等はTSQLでは厄介です。 LEN 関数は言う:

    指定された文字列式のバイト数ではなく文字数を返します。末尾の空白を除く

    DATALENGTHを使用する必要があります 真のbyteを取得するには 問題のデータの数。 Unicodeデータがある場合、この状況で得られる値はテキストの長さと同じではないことに注意してください。

    print(DATALENGTH(' ')) --1
    print(LEN(' '))        --0
    

    式の同等性に関しては、次のように2つの文字列が同等であるかどうかが比較されます。

    • 短い文字列を取得
    • 空白のあるパッド 長さが長い文字列の長さと等しくなるまで
    • 2つを比較する

    予期しない結果を引き起こしているのは中間のステップです。そのステップの後、空白と空白を効果的に比較しているため、それらは等しいように見えます。

    LIKE =よりも適切に動作します 「空白」の状況では、一致させようとしたパターンに対して空白のパディングが実行されないためです。

    if '' = ' '
    print 'eq'
    else
    print 'ne'
    

    eqを与えます 一方:

    if '' LIKE ' '
    print 'eq'
    else
    print 'ne'
    

    neを提供します

    LIKEに注意してください ただし、対称ではありません。末尾の空白はパターン(RHS)で重要として扱われますが、一致式(LHS)では扱われません。以下はここから抜粋したものです:

    declare @Space nvarchar(10)
    declare @Space2 nvarchar(10)
    
    set @Space = ''
    set @Space2 = ' '
    
    if @Space like @Space2
    print '@Space Like @Space2'
    else
    print '@Space Not Like @Space2'
    
    if @Space2 like @Space
    print '@Space2 Like @Space'
    else
    print '@Space2 Not Like @Space'
    
    @Space Not Like @Space2
    @Space2 Like @Space
    


    1. パラメータがNULLの場合にデフォルト値を列に挿入する

    2. androidでsqlitedbを正しく設定する

    3. SQLServerのSelectステートメントでNull値を不明に置き換える方法-SQLServer/TSQLチュートリアルパート111

    4. java.sql.TimestampでJoda-Timeを使用する方法