2016-07-11 5 views
2

Die Zoning-Daten, die ich bekomme, hat eine Reihe von drei Spalten - red, green und blue. Sie sind die R-, G- und B-Werte der Füllfarbe für verschiedene Planungszonen.PostgreSQL: saubere Konvertierung von numerischen zu 2-stelligen Hexadezimal

In den ursprünglichen Tabellen sie sind VARCHAR, aber ich wandle sie in INT da die R-, G- und B-Werte in RGB sind kanonisch 8-Bit (sonst immer wenn Sie die Werte für ihren eigentlichen Zweck Sie bis verwenden mögen, beenden in Doppelpunkt-Hölle - und mehr Doppelpunkte muss schlecht sein, richtig?).

Also sowieso, für Präsentationsschicht Zeug brauche ich die RGB als Hex-Farbe (d. H. # 000000 - #FFFFFF).

Ich kenne zwei Möglichkeiten, dies zu tun:

upper('#'||lpad(to_hex(red)::text,2,'0')||lpad(to_hex(green)::text,2,'0')||lpad(to_hex(blue)::text,2,'0')) 

oder

upper('#'||lpad(to_hex(((red * 65536) + (green * 256) + blue))::text,6,'0')) 

Beide sind ziemlich Kolon-schwer und scheinen wirklich super-kludgy durch Vergleich mit Python

'#%02x%02x%02x' % eval(a,) 

Wo a = (rot, grün, blau) aus der db von einem cursor.execute extrahiert .

Die lpad() auf jeder PostgreSQL-Variante ist notwendig, gültig hex Farben zu erhalten: zu sehen, warum, konvertiert (5,189,94) oder (0204153) ohne lpad -ing, und setzen die Ergebnisse (# 5BDC2 und # 0CC99/# CC99 respektive) in einen Farbprüfer.

Die upper() ist nur meine Vorliebe für All-Caps in Farbcodes; das Python eval() oben gibt Allcaps.

Jetzt die Frage: gibt es eine mehr-sparsame Möglichkeit, dies in PostgreSQL zu tun, ohne nur eine Funktion zu schreiben, die eine der beiden oben beschriebenen Varianten implementiert?

Es wäre einfach, es zu einer Funktion zu machen, aber wenn es bereits native Funktionalität (entweder In-Abfrage oder eine sparsamere Art, es als eine Funktion zu kodieren), wäre es nützlich zu wissen.

Umgebung: PostgreSQL 9.3.5 (Windows).

Antwort

3
SELECT 
    '#' || lpad(upper(to_hex((R << 16) | (G << 8) | B)), 6, '0') 
FROM (
    SELECT 
     1 AS R, 
     28 AS G, 
     123 AS B 
    ) AS RGB; 

Kein Doppelpunkt verwendet;) Aber ich habe PostgreSQL 9.5, ich hoffe, es funktioniert auch auf 9.3.5.

+0

Gerade als ich meine eigene Antwort tippte, sehe ich das :) – e4c5

+0

@Adam danke. ** D'oh **! Ich hätte gedacht, die Dokumentation für bitweise Shift-Operatoren zu überprüfen - ich benutze diese ziemlich in Python und die Syntax ist die gleiche (wie PHP: die Syntax für Octave und R ist sehr unterschiedlich). Ich kann bestätigen, dass die Lösung auch in 9.3.5 funktioniert. –

Verwandte Themen