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

タイプbyteaを倍精度にキャストする方法

    この目的のための最善の解決策は、SQLコマンドを使用してIEEE754-1985標準を使用してバイトに変換することです。

    まず、IEEE754-1985規格で定義されている特殊なケースをチェックする必要があります。次に、特別な場合がない場合は、標準のアルゴリズムに従って変換します。サンプルコードは以下のとおりです。

    入力はbytea_value bytea, is_little_endian booleanです。 次に、以下のように4バイトに分割します。

      byte_array[0]:= get_byte(bytea_value, 0);
      byte_array[1]:= get_byte(bytea_value, 1);
      byte_array[2]:= get_byte(bytea_value, 2);
      byte_array[3]:= get_byte(bytea_value, 3);
    

    次に、リトルエンディアンまたはビッグエンディアンを考慮してバイナリ値を取得します

    IF is_little_endian THEN
            binary_value:= byte_array[0]::bit(8) || byte_array[1]::bit(8) || byte_array[2]::bit(8) || byte_array[3]::bit(8);
        ELSE
            binary_value:= byte_array[3]::bit(8) || byte_array[2]::bit(8) || byte_array[1]::bit(8) || byte_array[0]::bit(8); 
        END IF;
    

    次に、特殊なケースを確認します:

    IF binary_value = '00000000000000000000000000000000' OR binary_value = '10000000000000000000000000000000' THEN -- IEEE754-1985 Zero
            return 0.0;
        END IF;
    
    sign := substring(binary_value from 1 for 1);
        exponent := substring(binary_value from 2 for 8);
        mantissa := substring(binary_value from 10 for 23); 
    
        IF exponent = '11111111' THEN
            IF mantissa = '00000000000000000000000' THEN   -- IEEE754-1985 negative and positive infinity
                IF sign = '1' THEN                    
                    return '-Infinity';                    
                ELSE                    
                    return 'Infinity';  
                END IF;                  
            ELSE
              return 'NaN'; -- IEEE754-1985 Not a number
            END IF; 
        END IF;
    

    特別な場合に属さない場合は、次のように変換してください。

    exp := exponent::int;
    
        IF exp > 126 THEN
         exp := exp - 127;
        ELSE
         exp:= -exp;
        END IF;
    
        WHILE mantissa_index < 24 LOOP
            IF substring(mantissa from mantissa_index for 1) = '1' THEN
                result := result + power(2, -(mantissa_index));
            END IF;
            mantissa_index = mantissa_index + 1;
        END LOOP;
    
        result := result * power(2, exp);
    
        IF(sign = '1') THEN
            result = -result;
        END IF;
    
        return result;
    


    1. 左結合横方向および配列集合体

    2. SQLServerテーブルで列をNullから非Nullに変更する方法-SQLServer/T-SQLチュートリアルパート52

    3. macosxでpostgresを再起動できません

    4. 文字列をblobjavaに変換します