PostgreSQL & PHP: Formatierung von Datensätzen in einer Tabelle

Hallo PostgreSQL-Gemeinde!

Ich habe nur lesenden Zugriff auf eine PostgreSQL-Datenbank und möchte via PHP Datensätze aus einer Tabelle auslesen. Ich bin schon relativ weit gekommen und muss nur noch die ausgegebenen Datensätze in eine andere Form bringen. Vielleicht könnt ihr mir weiterhelfen?

Wie kann ich z. B. für die Spalte “Status” eine einfache Suchen/Ersetzen-Funktion hinzufügen, also dass aus den folgenden Zahlen/Buchstaben immer diese werden:

1UXUTFFJLSTACTLY → “0%”
3UXUTFFJCQCTEUJQ → “50%”
4JETPSEQKCMXCJYU → “100%”

Ich habe schon einige Lösungsansätze versucht, aber mache wohl immer einen Fehler. Zum Beispiel mit:
replace(string text, from text, to text)
regexp_replace(string text, pattern text, replacement text [, flags text])

Ich glaube aber auch, dass ich die Befehle in meinem Quelltext an einer falschen Stelle verwendet habe…kann mir jemand einen Tipp geben?

Vielen Dank im Voraus!

Das ist der Output vom Quellcode




<html>

  <head>
    <meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8" />
   <title>Verkäufe</title>
  </head>

<body>
  
  <?
  $link = pg_Connect("port=36000 host=192.168.1.3 dbname=data user=revolverserver password=");
  $result = pg_exec($link, "select * from l_261 where department='4' and state='4' and doctype='283' and color='6' OR department='4' and state='4' and doctype='283' and color='2' ORDER BY docid DESC");
  $numrows = pg_numrows($result);
  echo "Anzeigen = $numrows</p>";
  ?>

  <table border="0">
  <tr>
   <th>AB-Nr.</th>
   <th>Datum</th>
   <th>Kunde</th>
   <th>Schaltungspreis</th>
   <th>Status</th>
  </tr>
  
  <?
   for($ri = 0; $ri < $numrows; $ri++) {
    echo "<tr>\n";
    $row = pg_fetch_array($result, $ri);
    echo " <td>", $row["docid"], "</td>
   <td>", $row["f_2"], "</td>
   <td>", $row["f_19"], "</td>
   <td>", $row["f_8"], "</td>
   <td>", $row["f_65uxuteysclxxqpqq"], "</td>
  </tr>
  ";
   }
   pg_close($link);
  ?>
  </table>

  </body>

  </html>

geht mit CASE WHEN:

test=*# select * from leave2 ;
 id |      status
----+------------------
  1 | 1UXUTFFJLSTACTLY
  2 | 3UXUTFFJCQCTEUJQ
  3 | 4JETPSEQKCMXCJYU
(3 rows)

test=*# select id, case when status = '1UXUTFFJLSTACTLY' then '0%' when status = '3UXUTFFJCQCTEUJQ' then '50%' when status = '4JETPSEQKCMXCJYU' then '100%' else 'falser Wert' end as status from leave2 ;
 id | status
----+--------
  1 | 0%
  2 | 50%
  3 | 100%
(3 rows)

Hoi,

alternativ kannst du das ganze auch als Array im PHP abbilden und dann entsprechend vor der Ausgabe abfragen.
Hat den Vorteil, das du bei späteren Änderungen nur das Array und nicht das ganze SQL-Statement bearbeiten musst (Stichwort Fehleranfälligkeit und so). Außerdem wäre es etwas übersichtlicher, den mit 3 Status mag das gehen, ab 15 wird es dann langsam etwas unübersichtlich.
Das aber nur als zusätzliche Idee, es funktioniert natürlich auch wunderbar wie von akretschmer beschrieben :slight_smile: