# SQL substring funktioniert nicht



## octron80 (18. Mai 2010)

*(postgre)SQL substring funktioniert nicht*

Hi, ich sitze nun schon seit einigen Stunden an einder SQL-Abfrage und komme einfach nicht weiter. Wir müssen für unser Studium einige SQL-Abfragen auf eine Fußballdatenbank formulieren. Wir haben eine Tabelle Games mit ner "gamesid", "dayofplay", "season" (String yyyy/yyyy), "day", "hometeam", "awayteam", "homegoals", " awaygoals", und eine Tabelle mit Players, mit den Spalten "pid" "team" "season" "name" und "birthday" (date). 
Von den Tabellen müssen wir nun abfragen Welcher Spieler in einem Jahr geboren wurde, in denen Hamburg nicht zuhause gegen Bayer Leverkusen gespielt hat. 

Ich bin bisher nur so weit gekommen, dass ich die Jahre ausgeben konnte, in denen Hamburg nicht gegen Bayer zuhause gespielt hat mit der Abfrage:

(SELECT season 
FROM Games
WHERE hometeam = 'Hamburger SV') EXCEPT
(SELECT season
FROM Games
WHERE awayteam = 'Bayer Leverkusen')

Wenn ich nun jedoch versuche mit den Strings, die ich da ausgegeben bekomme was zu machen bekomme ich nur Fehler zurück. Ich wollte aus der season die in dem Format '2003/2004' als String gespeichert sind mit SUBSTRING ein Jahr herausfiltern, aber ich bekomme so nur Fehler (ERROR: syntax error at or near "EXCEPT") zurück:

SELECT SUBSTRING((SELECT season 
FROM Games
WHERE hometeam = 'Hamburger SV') EXCEPT
(SELECT season
FROM Games
WHERE awayteam = 'Bayer Leverkusen')) FROM 1 FOR 4;

benutze ich SUBSTRING falsch, oder muss ich da mehr umschreiben?

vielen Dank für die Hilfe, 
mfg


----------



## FrankBooth (18. Mai 2010)

Hallo,

so wie ich das sehe ist dein select falsch bzw deine Verwendung von substring.



```
SELECT SUBSTRING(season from 1 for 4) as Jahr
FROM Games
WHERE hometeam = 'Hamburger SV') EXCEPT
(SELECT season
FROM Games
WHERE awayteam = 'Bayer Leverkusen')
```

glaube so ist es richtig, kenn mich aber mit EXCEPT nicht so gut aus.

Was gehen würde, bei dir aber nicht zum richtigen Ergebnis führt, wäre:


```
SELECT SUBSTRING(season from 1 for 4) as Jahr
FROM Games
WHERE hometeam = 'Hamburger SV')
and  awayteam = 'Bayer Leverkusen')
```
nur damit du siehst wie substring funktioniert.

Wenn das erste Beispiel nicht funktioniert, musst du es evtl. über subselect lösen das wird sicher laufen, wenn deine erste Abfrage 2003/2004 liefert:


```
SELECT SUBSTRING(sub.saison from 1 for 4) as Jahr
from (season as saison
      FROM Games
      WHERE hometeam = 'Hamburger SV') EXCEPT
      (SELECT season
      FROM Games
      WHERE awayteam = 'Bayer Leverkusen')) sub
```


----------



## octron80 (18. Mai 2010)

vielen Dank, ich habs nun raus. Ich musste ja zusätzlich noch die players ausgeben, die in den Jahren geboren sind, in denen HSV und Bayer nicht gegeneinander gespielt haben. 
Das müsste dann so aussehen:

```
SELECT name
FROM Players
WHERE date_part('year', birthday) IN
	(SELECT SUBSTRING(season FROM 1 FOR 4) AS Jahr
	FROM Games
	WHERE hometeam = 'Hamburger SV' EXCEPT
	(SELECT SUBSTRING(season FROM 1 FOR 4) AS Jahr2
	FROM Games
	WHERE awayteam = 'Bayer Leverkusen'))
ORDER BY date_part('year', birthday);
```


----------



## octron80 (18. Mai 2010)

Ich hab nochmals ne Abfrage, die eigentlich nicht schwer aussieht auf dem gleichen Schema. Ich hoffe, das ist ok, dass ich das im gleichen thread poste.
und zwar muss ich bei den players alle kombinationen von pid's finden, die in der gleichen season beim gleichen team gespielt haben. es dürfen alle kombinationen nur 1 mal vorkommen, was auch mein problem ist. wie schaffe ich es mit der folgenden Abfrage, die doppelten kombinationen zu entfernen?

```
b)	SELECT DISTINCT p1.pid, p2.pid, p1.season, p1.team
FROM Players p1, Players p2
WHERE p1.season = p2.season AND p1.team = p2.team AND NOT p1.pid = p2.pid
```

vielen dank, mfg


----------

