2016-05-11 13 views
1

Ich kann dies mit PHP am Ende erreichen, aber es wäre eleganter, es in SQL zu haben. Ich habe keine andere Wahl, als PostgreSQL für dieses Projekt zu verwenden, und ich habe es nie benutzt, so ...PostgreSQL-Funktion prüfen, ob Feld CSV ist

Es gibt einen Tisch ‚test_results‘, die die Spalten enthält:

sample_id(text) | test_result(text) | sessiontime(bigint) 

Eine andere Tabelle hat Informationen, die die sample_id enthält, aber einige haben mehrere Tests ausgeführt. Wenn das passiert, wird das Feld sample_id mit einer CSV-Liste sample_id s gefüllt. Nicht alle sample_id s sind in der Tabelle test_results vorhanden. Es gibt auch keine Möglichkeit zu wissen, wie viele Tests ausgeführt wurden.

Wenn es nur einen sample_id gibt, wird es in der Tabelle sein und sollte zurückgegeben werden. Andernfalls muss das CSV-Feld aufgeteilt und überprüft werden, um festzustellen, ob es existiert und da nur ein test_result zurückgegeben werden muss, muss der mit der letzten sessiontime (der epochtime ist) zurückgegeben werden.

Ich bin über diese vielen Möglichkeiten gewesen und mein Code ist jetzt ein Wirrwarr von nicht praktikablen ... Guidance würde geschätzt werden. Ich kann immer zurückgehen und es in der PHP tun, wenn ich brauche ...

EDIT klar zu sein .. So etwas wie dies:

DROP FUNCTION get_test_results(text); 
CREATE OR REPLACE FUNCTION get_test_results(sample_id TEXT) returns 
table(test_results text) as $$ 
BEGIN 
    IF position("," in sample_id) THEN 
     -----DO SOMETHING to 
    ELSE 
    SELECT test_results FROM test_results WHERE sample_id = sample_id ORDER BY sessiontime DESC; 
    END IF; 
END 
$$ LANGUAGE plpgsql; 

Dies funktioniert noch nicht .... split_part muss (sample_id, ',' :: text, 1) dann alle Ergebnisse abrufen, aber diejenige mit der letzten Sessiontime.

+0

"ein Durcheinander von nicht ausführbaren...". Leider wäre Ihr Code wahrscheinlich sauberer, wenn Sie eine Junction-Tabelle verwendet hätten, um die Beispiel-IDs in einer Tabelle mit einer Zeile pro Test und pro Beispiel-ID zu speichern. –

+1

Bitte bearbeiten Sie Ihre Frage und fügen Sie die 'create table' Anweisungen für die betreffenden Tabellen, einige Beispieldaten (als' insert') und die darauf basierende Ausgabe hinzu. Formatierter Text bitte, [nicht Screenshots] (http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557 # 285557) –

+0

Es gibt zahlreiche JOINs ... alle Tische? – Lithodora

Antwort

1

PostgreSQL ist eine ausgezeichnete Wahl und sehr vielseitig für solche Dinge.

Zunächst, um zu bestimmen, ob Ihr sample_id ein einzelner Wert oder eine Liste von Werten ist:

-- (sample_id ~ '^ *\d\+ *$') returns true if there is one number only 
SELECT CASE WHEN sample_id ~ '^ *\d\+ *$' THEN sample_id::int END 

Dann die Liste des IDs in einer durch Kommata getrennte Liste öffnen von Proben Sie die UNNEST können Array von string_to_array zurückgegeben:

SELECT i 
FROM unnest(string_to_array(sample_id, ',')::int[]) i 

Sie können, dass entweder für einzelne oder mehrere Nummern verwenden (da es nur ein Wert ist, werden Sie nur eine Zeile zu bekommen).

+0

FEHLER: Text kann nicht umgewandelt werden [] in Integer – Lithodora

+0

@Lithodora behebt den Fehler –