2016-07-22 6 views
1

Momentan suche ich nach einer Lösung, um eine Zeichenkette eines Varchar auszuschneiden.Einen String aus varchar auswählen MySQL, Stored Procedure

Ich habe einen Cursor, der durch alle Zeilen läuft, die ich von einer SQL-Anweisung bekomme. In jeder dieser Zeilen ist ein '#' enthalten und dieses möchte ich ausschneiden und in eine andere Tabelle einfügen.

Aber wie kann ich die '#' und die folgenden Zeichen schneiden?
Ich dachte über das Teilen nach, aber fand keine Lösung, wie man das in MySQL macht.

Ich hoffe, dass Sie mir helfen können,

+0

Sie könnten die String-Funktionen verwenden, aber die Logik wäre etwas komplex. –

Antwort

1

Angenommen, Sie eine Zeichenfolge wie first #second third hatte, Sie MySQL-Funktionen String verwenden könnte extrahieren second:

SUBSTRING(SUBSTRING(col, INSTR(col, '#') + 1), 
      1, 
      INSTR(SUBSTRING(col, INSTR(col, '#') + 1), ' ') - 1) 

Dies setzt voraus, dass es nur eine Raute (#), und dass das Delimeter für das Ende der Zeichenfolge, die Sie extrahieren möchten, ein Leerzeichen ist.

+0

Danke für Ihre Antwort, aber wenn es mehr Hashtags in einer Zeile gibt? Wie kann ich damit umgehen? –

+0

Nun, kannst du die Logik beschreiben, wie du bestimmen würdest, welcher Hashtag der ist, den du willst? Ich würde sagen, wenn Sie es als zu komplex empfinden, könnten Sie die Daten besser in Ihre App-Ebene einlesen und dort extrahieren. –

+0

Nein, ich will nicht "die eine", wenn es mehr Hashtags in diesem Varchar gibt, die ich alle schneiden möchte. Danach füge ich sie in eine neue Tabelle ein. –

0

Hier und Beispiel für eine Funktion dieses

delimiter // 
CREATE DEFINER=`root`@`localhost` FUNCTION `cut`(`instring` varchar(255)) 
    RETURNS varchar(255) CHARSET latin1 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
begin 
declare tempstring varchar(100); 
declare outstring varchar(100); 
declare checkit int; 
declare firsthashpos int; 
declare tempid int; 

set tempstring = ltrim(rtrim(instring)); 
set checkit = 0; 


if instr(tempstring,'#') then set firsthashpos = instr(tempstring,'#'); end if; 

looper: while tempstring is not null and instr(tempstring,'#') > 0 do 

     set outstring = reverse(substring(reverse(tempstring),1,instr(reverse(tempstring),'#'))); 
     set tempstring = replace(tempstring,reverse(substring(reverse(tempstring),1,instr(reverse(tempstring),'#'))),''); 

     insert into b (address) values (outstring); 

end while; 

return concat(tempstring); 
end// 
delimiter ; 

dies in b

select * from a; 
+------+---------------------+ 
| id | address    | 
+------+---------------------+ 
| 1 | 13 #ont 12#45 st | 
| 2 | 13 #ont 12345 st | 
| 3 | 13 #ont 12#45 45678 | 
| 4 | 56789 #ont 12#45 st | 
+------+---------------------+ 

das Ergebnis von

select id,address,cut(address) 
from a 
where instr(address,'#') > 0; 

Ergebnisse gegeben tun

select * from b; 
+----+---------------+ 
| id | address  | 
+----+---------------+ 
| 1 | #45 st  | 
| 2 | #ont 12  | 
| 3 | #ont 12345 st | 
| 4 | #45 45678  | 
| 5 | #ont 12  | 
| 6 | #45 st  | 
| 7 | #ont 12  | 
+----+---------------+ 

Der Rückgabewert der Funktion (outstring) enthält, was nach den Bits nach dem Entfernen der #s übrig ist. Hoffentlich ist die String-Manipulation in der Funktion selbsterklärend.

+0

Haha danke, aber ich habe beschlossen, das Zeug in PHP zu tun :) –

Verwandte Themen