Datenbank Forum - für Anfänger und Profis

Willkommen im Datenbank Forum von Datenbanken-verstehen.de - Das Datenbank, Data Warehouse & Business Intelligence Forum!

Das Datenbank Forum für Anfänger und Profis ist eine Community zu den Themen Datenbanken, Data Warehouse & Business Intelligence. Nimm teil an der Community von Datenbanken-verstehen.de und tausch dich mit deinen Fragen und Lösungen mit anderen Nutzern aus.

Als registrierter Benutzer genießt Du viele Vorteile, wie

  • den vollen Zugang zu allen Foren und Unterforen
  • Kostenloses Lernmaterial inkl. Lösungen zum Thema Datenbanken
  • Zugriff auf DB-Tutorials, Best Practices und SQL-Snippets

Bevor Du einen Beitrag verfassen möchtest, kannst Du dich einfach kostenlos registrieren.

oder Einloggen mit



Beachte bitte die Forenregeln von Datenbanken-verstehen.de. Wir wünschen Dir viel Spaß im Datenbank Forum! - Dein Datenbanken-verstehen.de-Team

Syntax substring_index...

Alles zur Datenbankentwicklung im MySQL-Umfeld...

Syntax substring_index...

Beitragvon Grocco » Do 19. Mär 2015, 14:22

Hi @ all,

ich bin absoluter Neuling in SQL, möchte aber gern fit werden da ich das schon faszinierend finde. Kann gut sein das ich zukünftig noch ein paar andere dumme Fragen stellen muss, aber bitte sehts mir nach.
Ich gehe ich gerade das Buch "SQL von Kopf bis Fuß" durch. Ich experememtiere auch gerne mit den Befehlen etwas weg vom Buch herum, und bin da grad auf was gestossen wo ich nicht wirklich weiterkomme.
Es geht um SUBSTRNG_INDEX Befehl.
Senario:
Es geht um eine Filmliste, dazu habe ich eine Spalte erstellt, wo ich einen DATE Datentyp drin habe.
Ich möchte mir in eine neue Tabelle anlegen die Monate bzw Jahre herauszieht, und ich weiß, eine Möglichkeit wäre auch mit RIGHT und LEFT.
Ich wollte es aber auch mit SUBSTRING_INDEX versuchen, was meiner Meinung ja möglich sein sollte....Also das hier klappt:
Code: Alles auswählen
select substring_index(erworben, '-', 1) from film_tabelle2;
-->bekomme Jahreszahl, aus Spalte 'erworben' mit dem Datum.
ABER....wenn ich dies jetzt für eine neue Tabelle anlegen möchte(also die Jahreszahlen in einer seperaten tabelle angelegt werden, schlägts fehl...hier mein Befehl (auch mehrere versucht), kommen aber immer wieder Syntaxfehler..
drop table if exists zwischendrin;
Code: Alles auswählen
create table zwischendrin
(zwischen int);

--> bis hier alles OK
Code: Alles auswählen
insert Into zwischendrin
(zwischen)
values
(substring_index(erworben, '-', 1) from film_tabelle2;
-->Syntxfehler, aber wo?
Andere Versuche:
Code: Alles auswählen
('substring_index(erworben, '-', 1)' )from film_tabelle2;

oder
Code: Alles auswählen
('substring_index(erworben, '-', 1) from film_tabelle2');

oder
Code: Alles auswählen
('substring_index(erworben, '-', 1) from film_tabelle2');

...könnt ihr mir hier mal auf die Sprünge helfen...

..würde das auch gehen --> substring_index(erworben, between '-' and '-', 1) from film_tabelle2 ...oder so ählich, um den Monat zu bekommen..klappt ja auch nicht.

Und schonmal ein dickes DANKE im voraus :-)
Gruß Grocco
Grocco
 
Beiträge: 5
Registriert: Do 12. Mär 2015, 21:16

Re: Syntax substring_index...

Beitragvon RainerH » Do 19. Mär 2015, 15:15

Hallo Grocco,

willkommen im Forum.
Dumme Fragen gibt es nicht, dafür ist das Forum ja da ;)

Also in deinem Statement fehlt schon mal das Wort 'SELECT', was ich jetzt so sehen kann.
Kannst Du mal dein SQL Skript posten, dann muss ich das nicht alles selber nachbauen :D

Ich kann dir bestimmt helfen...

Gruß,
Rainer
Nimm NICHTS persönlich -- alles ist Feedback...
RainerH
 
Beiträge: 221
Registriert: Fr 1. Nov 2013, 17:58

Re: Syntax substring_index...

Beitragvon Grocco » Do 19. Mär 2015, 22:30

Hallo Rainer, danke für deine Hilfe...
also ich hab mal das select vorne mit rangestellt, dachte bisher das dies nur bei Abfragen gebraucht wird, klappte aber nicht :-(
Wie schon erwähnt, ich möchte eingentlich aus der Spalte "erworben" das Jahr bzw. den Monat herausziehen und in einer seperaten Tabelle anlegen, klappt nur leider noch nicht....hier mal der gesamte Vorgang...und nicht wundern, ich mach mir gelegentlich ein paar Notizen dazu, um, wenn ich mal was nachschauen möchte, es schneller finde :-)...und 'W und 'F' steht für Wahr und Falsch, OA ohne Altersbeschränkung..das du da nicht raten musst. Funzt auch alles bisher bis ganz unten wo ich das Table 'zwischendrin' versuche:
Code: Alles auswählen
DROP DATABASE IF EXISTS videothek;
CREATE DATABASE videothek;
USE videothek;

CREATE TABLE film_tabelle1
(
film_id1 INT Auto_Increment,
Titel VARCHAR(50) NOT NULL,
FSK VARCHAR(2) NOT NULL,
Drama CHAR(1) NOT NULL,
Comedy CHAR(1) NOT NULL,
Action CHAR(1) NOT NULL,
Schocker CHAR(1) NOT NULL,
SciFi CHAR(1) NOT NULL,
Ki_Fi CHAR(1) NOT NULL,
zeichentrick CHAR(1) NOT NULL,
Erworben DATE NOT NULL,
Primary KEY (film_id1)
);

INSERT INTO film_tabelle1
-- (film_id1, Titel, FSK, Drama, Comedy, Action, Schocker, SciFi, Ki_Fi, zeichentrick, Erworben)
VALUES
(1, 'Monsters, Inc', 'OA', 'F', 'W', 'F', 'F', 'F', 'W', 'W', '2002-06-03'),
(2, 'Der Pate', 16, 'F', 'F', 'W', 'W', 'F', 'F', 'F', '2001-02-05'),
(3, 'Vom Winde verweht', 'OA', 'W', 'F', 'F', 'F', 'F', 'F', 'F', '1999-11-20'),
(4, 'American Pie', 16, 'F', 'W', 'F', 'F', 'F', 'F', 'F', '2003-04-19'),
(5, 'Nightmare on Elm Street', 16, 'F', 'F', 'W', 'W', 'F', 'F', 'F', '2003-04-19'),
(6, 'Casablanca', 6, 'W', 'F', 'F', 'F', 'F', 'F', 'F', '2001-02-05')
;
Alter Table film_tabelle1
ADD Column kategorie VARCHAR(20) NOT NULL AFTER Erworben;

Update film_tabelle1 set kategorie = 'Drama' where Drama = 'W';
Update film_tabelle1 set kategorie = 'Comedy' where Comedy = 'W';
Update film_tabelle1 set kategorie = 'Action' where Action = 'W';
Update film_tabelle1 set kategorie = 'Schocker' where Schocker = 'W';
Update film_tabelle1 set kategorie = 'SciFi' where SciFi = 'W';
Update film_tabelle1 set kategorie = 'Ki_Fi' where Ki_Fi = 'W';
Update film_tabelle1 set kategorie = 'zeichentrick' where zeichentrick = 'W' and fsk = 'OA';
Update film_tabelle1 set kategorie = 'Verschiedenes' where zeichentrick = 'W' and fsk <> 'OA';
Select * from film_tabelle1;

-- Tabelle wird erweitert für neue String Funktion
CREATE TABLE film_tabelle2
(
film_id2 INT Auto_Increment,
Titel VARCHAR(50),
FSK VARCHAR(2),
Drama CHAR(1),
Comedy CHAR(1),
Action CHAR(1),
Schocker CHAR(1),
SciFi CHAR(1),
Ki_Fi CHAR(1),
zeichentrick CHAR(1),
Erworben DATE,
Primary KEY (film_id2)
);

INSERT INTO film_tabelle2
(Titel, fsk, Drama, Comedy, Action, Schocker, SciFi, Ki_Fi, Zeichentrick, Erworben)
VALUES
('Das große Abenteuer', 'OA', 'F', 'F', 'F', 'F', 'F', 'W', 'F', '2003-04-19'),
('Gregor: Das Geheimnis', 6,  'F', 'F', 'W', 'F', 'F', 'F', 'F', '2001-02-05'),
('Durchgedrehts Clowns', 16,  'F', 'F', 'F', 'W', 'F', 'F', 'F', '2001-02-05'),
('Paraskavedekatriaphobia', 16, 'W', 'W', 'W',  'F', 'W',  'F', 'F', '1999-11-20'),
('Eine Ratte namens Dirk', 'OA',  'F', 'F', 'F', 'F', 'F', 'W', 'F', '2001-02-05'),
('Das Ende der Linie', 16, 'W', 'F', 'F', 'W', 'W',  'F', 'W', '2002-06-03'),
('Die glänzenden Dinge', 6, 'W',  'F', 'F', 'F', 'F', 'F', 'F', '2003-04-19'),
('Nimm es zurück', 16,  'F', 'W',  'F', 'F', 'F', 'F', 'F', '2003-04-19'),
('Haifutter', 'OA',  'F', 'F', 'F', 'F', 'F', 'W', 'F', '2002-06-03'),
('Polderpiraten', 16,  'F', 'F', 'F', 'F', 'F', 'F', 'W', '1999-11-20'),
('Unbewohnte Welten', 6, 'F', 'W',  'F', 'F', 'W',  'F', 'F', '2001-02-05'),
('Nightmare on Elm Street', 16, 'F', 'F', 'W', 'W', 'F', 'F', 'F', '2003-04-19'),
('Casablanca', 6, 'W', 'F', 'F', 'F', 'F', 'F', 'F', '2001-02-05'),
('Monsters, Inc', 'OA', 'F', 'W', 'F', 'F', 'F', 'W', 'W', '2002-06-03'),
('Der Pate', 16, 'F', 'F', 'W', 'W', 'F', 'F', 'F', '2001-02-05'),
('Vom Winde verweht', 'OA', 'W', 'F', 'F', 'F', 'F', 'F', 'F', '1999-11-20'),
('American Pie', 16, 'F', 'W', 'F', 'F', 'F', 'F', 'F', '2003-04-19')
;   
ALTER TABLE film_tabelle2
ADD COLUMN kategorie VARCHAR(50);

Update film_tabelle2
set kategorie =
CASE
 WHEN Drama = 'W' THEN 'Drama'
 WHEN Comedy = 'W' THEN 'Comedy'
 WHEN Action = 'W' THEN 'Action'
 WHEN Schocker = 'W' THEN 'Horror'
 WHEN SciFi = 'W' THEN 'SciFi'
 WHEN Ki_Fi = 'W' THEN 'Familie'
 WHEN Zeichentrick = 'W' and fsk <=6 THEN 'Familie'
 else 'Verschiedenes'
END;
select * from film_tabelle2;

 Update film_tabelle2
 SET kategorie =
 CASE
 WHEN fsk = 'OA'  THEN 'Familie'
   WHEN Drama = 'W' and fsk >=16 THEN 'Drama ab 16'
   WHEN Drama = 'W' and fsk <16 THEN 'Drama'
   WHEN Comedy = 'W' and fsk >=16 THEN 'Comedy ab 16'
   WHEN Comedy = 'W' and fsk <16 THEN 'Comedy'
   WHEN Action = 'W' and fsk >=16 THEN 'Action ab 16'
   WHEN Action = 'W' and fsk <16 THEN 'Action'
   WHEN Schocker = 'W' and fsk >=16 THEN 'Horror ab 16'
   WHEN Schocker = 'W' and fsk <16 THEN 'Horror ab 16'
   WHEN SciFi = 'W' and fsk >=16 THEN 'SciFi ab 16'
   WHEN SciFi = 'W' and fsk <16 THEN 'SciFi'
   WHEN Ki_Fi= 'W' THEN 'Kinderfilm'
   WHEN Zeichentrick = 'W' and fsk >= 16 THEN 'Zeichentrick ab 16'
   WHEN Zeichentrick = 'W' and fsk <16 THEN 'Zeichentrick'
   else 'Familie'
END;
select * from film_tabelle2;

Alter Table film_tabelle2
   Drop Column Drama,
   Drop Column Comedy,
   Drop Column Action,
   Drop Column Schocker,
   Drop Column SciFi,
   Drop Column Ki_Fi,
   Drop Column Zeichentrick
   ;
   Select * from film_tabelle2;

insert into film_tabelle2 (titel, kategorie) VALUES ('Auf in den Himmel', 'Familie'); Select * from film_tabelle2;
Update film_tabelle2 set
erworben = '2002-06-25',                                       -- hier werden 2 Werte gleichzeitig in einer Spalte mit Update
                                                                           -- geändert bzw. hinzugefügt
fsk = '18'
where film_id2 = 24;
Select * from film_tabelle2;

select fsk, titel, kategorie, film_id2 from film_tabelle2 where fsk >=16 Order by titel asc;    -- Geordnete Liste anzeigen lassen
select titel, fsk, film_id2 from film_tabelle2 where titel between 'A' and 'O';                 -- Liste zwichen A und OA

Select titel, kategorie, erworben from film_tabelle2
Order by kategorie, erworben;
Select * from film_tabelle2
Order by kategorie, erworben desc, titel;                           --  <<BIS HIER ALLES KLAR

drop table if exists zwischendrin;        -- HIER SOLL DAS TABLE ANGELEGT WERDEN WELCHE DIE DATEN VON 'ERWORBEN DRIN HAT
create table zwischendrin                    -- UND DAS WILL NICHT SO WIE ICH WILL  :x
(zwischen int
);
insert Into zwischendrin
(zwischen)
values
[b]('select substring_index(erworben, '-', 1) from film_tabelle2');[/b] -- HIER SOLL DAS JAHR HERAUSGEZOGEN WERDEN!
select * from zwischendrin;


-- AUCH MÖCHTE ICH DEN MONAT HERAUSZIEHEN MIT substring_index(erworben, between '-' and '-',1) falls dies so gehen sollte
-- ABER ACHTUNG; >>>EINGABE EINFACH SO FUNKTIONIERT, ES GEHT DARUM, DIE GEFORDERTEN WERTEIN EIN NEUES TABLE, IN
-- DIESEM FALL "ZWISCHENDRIN" GESPEICHERT WERDEN SOLLEN
-- ZIEL IST ES ZU KAPIEREN WIE ICH AUS EINEM STRING ETWAS HERAUSZIEHEN KANN UND ES IN EINER TABELLE ABLEGE!
Grocco
 
Beiträge: 5
Registriert: Do 12. Mär 2015, 21:16

Re: Syntax substring_index...

Beitragvon RainerH » Sa 21. Mär 2015, 18:31

So habe mir das mal angeschaut, was du so treibst ;)

Versuche es mal mit diesem SQL-Statement:
Code: Alles auswählen
drop table if exists zwischendrin;       
create table zwischendrin (zwischen int);
   
insert Into zwischendrin (zwischen)
select substring_index(erworben, '-', 1) from film_tabelle2;
select * from zwischendrin;


Das Key "VALUES" wird nur dann relevant, wenn Du genau einen Wert erwartest,
daher geht sowas auch nicht in deinem Fall:
Code: Alles auswählen
drop table if exists zwischendrin;       
create table zwischendrin (zwischen int);
   
insert Into zwischendrin (zwischen)
Values(
(select substring_index(erworben, '-', 1) from film_tabelle2));
select * from zwischendrin;


So würde es wieder klappen für genau einen Wert:
Code: Alles auswählen
drop table if exists zwischendrin;       
create table zwischendrin (zwischen int);
   
insert Into zwischendrin (zwischen)
Values(
(select  substring_index(erworben, '-', 1) from film_tabelle2 LIMIT 1));
select * from zwischendrin;


Also nimm dieses Statement und Du wirst glücklich:
Code: Alles auswählen
drop table if exists zwischendrin;       
create table zwischendrin (zwischen int);
   
insert Into zwischendrin (zwischen)
select substring_index(erworben, '-', 1) from film_tabelle2;
select * from zwischendrin;


Gruß,
Rainer
Nimm NICHTS persönlich -- alles ist Feedback...
RainerH
 
Beiträge: 221
Registriert: Fr 1. Nov 2013, 17:58

Re: Syntax substring_index...

Beitragvon Grocco » Sa 21. Mär 2015, 19:09

AAAhh....super...bei den ganzen Möglichkkeiten die ich rumprobiert hab waren die wohl nicht dabei.....dabei lag es wohl am VALUES, und bei dem Bsp. mit VALUES das ganze in der Klammer nochmal in Klammer setzen....alles klar.....blöd nur das dies im Buch nicht ausführlicher besprochen wird.
Danke und bis bald, das nächste Rätsel wird sicher bald kommen :-)
Grocco
Grocco
 
Beiträge: 5
Registriert: Do 12. Mär 2015, 21:16

Re: Syntax substring_index...

Beitragvon Grocco » Sa 21. Mär 2015, 19:19

.. und wie ist es wenn ich die Monate rausziehen will...mit BETWEEN sollte das doch auch gehen..

drop table if exists zwischendrin;
create table zwischendrin (zwischen int);
insert Into zwischendrin (zwischen)
select substring_index(erworben, between '-' and '-', 1) from film_tabelle2;
select * from zwischendrin;

--> klappt leider nicht
wie wäre denn hier die richtige Syntax? ..wenn ich nochmal fragen darf :?:
Grocco
 
Beiträge: 5
Registriert: Do 12. Mär 2015, 21:16

Re: Syntax substring_index...

Beitragvon RainerH » So 22. Mär 2015, 09:28

An dieser Stelle musst Du dann auf die SQL Funktion RIGHT() zurückgreifen:
Code: Alles auswählen
drop table if exists zwischendrin;
create table zwischendrin (zwischen int);
insert Into zwischendrin (zwischen)
select right(substring_index(erworben, '-', 2),2) from film_tabelle2;
select * from zwischendrin;
Nimm NICHTS persönlich -- alles ist Feedback...
RainerH
 
Beiträge: 221
Registriert: Fr 1. Nov 2013, 17:58

Re: Syntax substring_index...

Beitragvon Grocco » Mo 23. Mär 2015, 14:00

aahhhh, alles klar, super und danke :-)
Grocco
Grocco
 
Beiträge: 5
Registriert: Do 12. Mär 2015, 21:16


Zurück zu MySQL

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

  • Jetzt Fan werden
  • Newsletter abonnieren? Hier anmelden!

    Alle Informationen aus dem Portal, Blog und Forum in einem Newsletter!

    E-Mail-Adresse: