2016-04-26 4 views
4

Ich habe einen Code in SQL, die ich verwende. Nicht viel mit Postgresql vertraut. Unten ist der Code, den ich in postgresql konvertieren möchte. Ich verwende dbeaver 3.5.4Sql zu postgresql

Update tablename 
set record_hash = cast(hashbytes('MD5', 
        coalesce(id, '') + 
        coalesce(name, '') + 
        coalesce(created_date, '') + 
        coalesce(last_modified_date, '') 
       ) as bigint) 
; 
+0

Postgres wird auch SQL. –

+1

Dbeaver ist ein SQL-Client für mehrere Datenbanken, der Eclipse-IDE als Basis verwendet. Mit welcher Datenbank ist es verbunden? Sie können dies in der Ansicht Datenbanknavigation sehen und dann auf "Verbindung bearbeiten" klicken. Es ist oben auf dem Fenster. –

+1

Nur um zu verdeutlichen: wollten Sie 16-Byte-MD5-Hash in das 8-Byte 'bigint' Feld speichern? – Abelisto

Antwort

1

Sie können es wie folgt tun:

Update tablename 
set record_hash = ('x'|| substr(
          md5(
           coalesce(id, '') || 
           coalesce(name, '') || 
           coalesce(created_date, '') || 
           coalesce(last_modified_date, '') 
          ),1,16)::bit(64)::bigint) 

here gefunden, wie die hash => Bigint Umwandlung zu tun.

+0

Vielen Dank für die Antworten. Ich benutzte diese Abfrage und ich bekomme DBCException: SQL Error [42846]: FEHLER: kann Text nicht in Bit umwandeln .. Scheint, ein Casting-Problem zu sein .. record_hash ist auf bpchar festgelegt .. Nicht sicher, welchen Datentyp ich für diese – Ramesh

+0

ändern sollte Was ist der Typ des record_hash-Feldes? –

+0

Jetzt habe ich es in numerischer, aber gleicher Fehler geändert. – Ramesh

1

Ich nehme an, dass diese hashbyte() Sache einen Hashwert generiert.

Um ein MD5-Prüfsumme in Postgres erstellen Sie die md5() Funktion verwenden können, zum Beispiel:

md5(concat(id::text, name, created_date::text, last_modified_date::date)) 

concat() wird automatisch den Nullwertes kümmern, keine Notwendigkeit für coalesce()

Leider nein es gibt direkte Umwandlung von einem hexadezimalen Wert auf eine ganze Zahl in Postgres

0

Postgres hat MD5 als integrierte Funktion:

Update tablename 
    set record_hash = ('x' || lpad(md5(coalesce(id, '') || 
             coalesce(name, '') || 
             coalesce(created_date, '') || 
             coalesce(last_modified_date, '') 
            ), 16, '0' 
           ) 
        )::bit(64)::bigint; 

Für die Konvertierung zurück zu bigint, geben Sie Kredit, wo Kredit ist due. Erwin Brandstetters Antworten sind normalerweise sehr gründlich, also würde ich erwarten, dass es gut funktioniert.

+0

ist nicht lpad fehlt 2. Argument? –

+1

@NelsonTeixeira. . . Vielen Dank. –

+0

Vielen Dank für die Antworten. Ich benutzte diese Abfrage und ich bekomme DBCException: SQL Error [42846]: FEHLER: kann Text nicht in Bit umwandeln .. Scheint, ein Casting-Problem zu sein .. record_hash ist auf bpchar gesetzt .. Nicht sicher, welchen Datentyp ich dafür ändern soll. – Ramesh

0

Wie info, hier gibt mehrere Ansätze, wie man ohne Datenverlust 16-Byte Daten represet:

with t(x) as (values(md5('abc123'))) 
select 
    t.x, -- varchar(32), char(32) 
    t.x::uuid, -- uuid 
    ('x'||t.x)::bit(128), -- exactly bit(128) 
    ('\x'||t.x)::bytea, -- bytea 
    array[('x'||left(t.x,16))::bit(64)::bigint, ('x'||right(t.x,16))::bit(64)::bigint] -- bigint[] 
    -- ... and so on 
from t; 
Verwandte Themen