2017-03-05 2 views
-1

Ich habe versucht, eine Wert-String-Spalte (Prozess) innerhalb einer Tabelle zu bearbeiten/hinzufügen.Berechnung in einem String-Feld MySQL

die aktuellen Werte in der Zeichenfolge ist wie folgt:

1:38,25:39,41:101 

Was will ich 1000 wird auf jeden Wert nach tun, fügen Sie „X:“ so nach der Abfrage die Werte sollte lauten:

1:1038,25:1039,41:1101 

Ich habe CONCAT betrachtet, aber das scheint nur einen Wert in eine Zeichenfolge innerhalb bestimmter Parameter einzufügen. Irgendwelche Ideen?

+2

Jetzt wissen Sie, warum Normalisierung hilft! – GurV

+0

@Paul zeigt das fragliche Beispiel einzelne Zeilen oder mehrere durch Komma getrennte Zeilen? –

Antwort

0

können Sie CASTCONCAT und SUBSTRING_INDEX Funktionen verwenden, um die erforderliche Ausgabe, z.B .:

SELECT 
CONCAT(SUBSTRING_INDEX(value, ':', 1), ":", (CAST(SUBSTRING_INDEX(value, ':', -1) AS UNSIGNED) + 1000)) 
FROM test; 

Hier ist die SQL Fiddle zu bekommen.

+0

Die fraglichen Daten sind ** nicht ** in separaten Zeilen. Daher beantwortet dies die gegebene Frage nicht. – GurV

0

Verwendung von Variablen können Ihnen helfen, zu erreichen, was Sie wollen:

select @pre := SUBSTRING_INDEX(SUBSTRING_INDEX(`column_name`, ':', 1), '0', -1), 
    @post := SUBSTRING_INDEX(SUBSTRING_INDEX(`column_name`, ':', 2), '0', -1), 
    concat(@pre,":",@post+1000) as required_value from table_name; 

Referenzen:

  1. zur Verwendung von Variablen: https://dev.mysql.com/doc/refman/5.7/en/user-variables.html
  2. für SUBSTRING_INDEX: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index
+0

Nicht sicher, ob dies die Frage beantwortet, aber ** niemals ** dieselbe Benutzervariable in derselben Anweisung liest und schreibt. Die Reihenfolge der Verarbeitung ist nicht garantiert und somit das Ergebnis. – GurV

0

Yo Sie sollten die Daten normalisieren und in einer separaten Tabelle speichern. Das heißt, Ihre Frage zu beantworten könnten Sie diese Abfragen verwenden, um zu erreichen, was Sie wollen:

CREATE TEMPORARY TABLE temp (val VARCHAR(50)); 
SET @str = CONCAT("INSERT INTO temp (val) VALUES ('",REPLACE((SELECT org FROM mytable LIMIT 1), ",", "'),('"),"');"); 
PREPARE st FROM @str; 
EXECUTE st; 

SELECT 
GROUP_CONCAT(DISTINCT CONCAT(SUBSTRING_INDEX(val, ':', 1), ":", (CAST(SUBSTRING_INDEX(val, ':', -1) AS UNSIGNED) + 1000))) 
FROM temp; 

So stellen Sie sicher SELECT org FROM mytable LIMIT 1 in der obigen Abfrage mit Ihrer Anfrage zu ersetzen, die die Zeichenfolge zurück 1:38,25:39,41:101 Sie bearbeiten müssen. Beachten Sie, dass dieses Beispiel nur zeigt, wie der Wert in einer Zeichenfolge verarbeitet wird. Wenn Sie Werte mehrerer Zeilen zu verarbeiten, müssen Sie ein bisschen mehr einstellen ...

prüfen sqlfiddle: http://sqlfiddle.com/#!9/bf6da4/1/0

Verwandte Themen