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

SQLを使用してアルファと数値を分割する

    数値部分が常に先頭にある場合は、次を使用できます:

    PATINDEX('%[0-9][^0-9]%', ConcUnit)
    

    最後の桁のインデックスを取得します。

    したがって、これは:

    DECLARE @str VARCHAR(MAX) = '4000 ug/ML' 
    
    SELECT LEFT(@str, PATINDEX('%[0-9][^0-9]%', @str )) AS Number,
           LTRIM(RIGHT(@str, LEN(@str) - PATINDEX('%[0-9][^0-9]%', @str ))) As Unit
    

    あなたに与える:

    Number  Unit
    -------------
    4000    ug/ML
    

    編集:

    数値データにdouble値も含まれている場合は、次を使用できます:

    SELECT LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str))
    

    最後の桁のインデックスを取得するには 。

    したがって、これは:

    SELECT LEFT(@str, LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str)))
    

    数値部分を提供します。

    そしてこれ:

    SELECT LEFT(@str, LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str))) AS Numeric,
           CASE 
              WHEN CHARINDEX ('%', @str) <> 0 THEN LTRIM(RIGHT(@str, LEN(@str) - CHARINDEX ('%', @str)))
              ELSE LTRIM(RIGHT(@str, PATINDEX ('%[^0-9][0-9]%', REVERSE(@str))))
           END AS Unit
    

    番号と単位の両方の部分を提供します。

    投稿したデータを使用して行ったテストは次のとおりです。

    入力:

    DECLARE @str VARCHAR(MAX) = '50 000ug/ML'
    

    出力:

    Numeric Unit
    ------------
    50 000  ug/ML
    

    入力:

    DECLARE @str VARCHAR(MAX) = '99.5%'
    

    出力:

    Numeric Unit
    ------------
    99.5    
    

    入力:

    DECLARE @str VARCHAR(MAX) = '4000 . 35 % ug/ML'
    

    出力:

    Numeric     Unit
    ------------------
    4000 . 35   ug/ML
    


    1. SQLテーブルから(複数の列の値に基づいて)重複する行を削除する

    2. plpgsql変数を使用してn_distinctを設定するときにエラーが発生しました

    3. SQLServer2019の新機能

    4. R12.2でのサービスグル​​ープの変更