2016-06-30 9 views
0

Es gibt eine Frage Tabelle mit einer Spalte namens options dieErhalten von regulären Ausdrücken String - alles bis zu einem Charakter

'r>>>>>5####answer1|4####answer2|3####answer3|2####answer4|1####answer5' 

enthält, die Paare von möglichen Antworten sind

  • 5 = answer1
  • 4 = antwort2
  • usw.

Die Fragen werden von Benutzern festgelegt, aber das Muster ist das gleiche.

Eine andere Tabelle hat eine Antwort des Benutzers, die die Option ausgewählt ist. Ich versuche SQL zu schreiben, um den Antworttext zu extrahieren.

Zum Beispiel sollte 4answer2 angezeigt werden.

Ich habe versucht:

SELECT substring(question.options from '%4####@"%@"[\|]%' for '@') AS answertext 
FROM ... 

Aber es zeigt answer2|3####answer3|2####answer4.

Wie bekomme ich alles bis zum ersten |?

+1

'substring (‘ r >>>>> 5 #### Antwort1 | 4 #### Antwort2 | 3 #### Antwort3 | 2 #### Antwort4 | 1 #### Antwort5 'von' 4 # + ([^ \ |] +) ') ' – Abelisto

+0

genial !! Danke :) –

+0

Versuchen Sie auch, 'x [1] als n, x [2] als ein aus regexp_matches ('r >>>>> 5 #### answer1 | 4 #### answer2 | 3 ### # answer3 | 2 #### answer4 | 1 #### answer5 ',' ([\ d] +) # + ([^ \ |] +) ',' g ') als t (x); '- wahrscheinlich wird es nützlicher sein. – Abelisto

Antwort

1

Der reguläre Ausdruck supplied by @Abelisto in a comment funktioniert gut. Sie brauchen nicht | in der Zeichenklasse zu entkommen, so kann es sein:

SELECT substring(options, '4#+([^|]+)' ... 

die Nummer der Antwort Unter der Annahme, auf eine einzelne Ziffer begrenzt ist, gibt es eine einfache Lösung ohne reguläre Ausdrücke zu :

SELECT right(x, -5) AS answer 
FROM question q, unnest(string_to_array(right(q.options, -6), '|')) x 
WHERE q.question_id = 1 
AND x LIKE '4%'; 

:

SELECT right(x, -5) AS answer 
FROM unnest(string_to_array(right(
     'r>>>>>5####answer1|4####answer2|3####answer3|2####answer4|1####answer5' 
     , -6), '|')) x 
WHERE x LIKE '4%'; -- pick number 

auf den Tisch Angewandt

Aber wirklich, sollten Sie normalize Ihr unglückliches Design. Es ist ein 1: n Design zwischen Frage und Antwort. Unter der Annahme einer PK question.question_id Sie können das Problem beheben schnell wie folgt aus:

CREATE TABLE answer AS 
SELECT q.question_id, left(x,1)::int AS answer_id, right(x, -5) AS answer 
FROM question q, unnest(string_to_array(right(q.options, -6), '|')) x; 

ALTER TABLE answer 
    ADD PRIMARY KEY (question_id, answer_id) 
, ADD CONSTRAINT q_fk FOREIGN KEY (question_id) REFERENCES question(question_id) 
     ON UPDATE CASCADE ON DELETE CASCADE; 

ALTER TABLE question DROP column options; 

dann Ihre Abfrage einfach ist:

SELECT answer 
FROM answer 
WHERE question_id = 1 
AND answer_id = 4; 

Verwandte:

Verwandte Themen