# order by mit ?



## marvin42 (5. Apr 2007)

Hi Leute,

ich schreib gerade mein erstes Programm mit Datenbanken und hab diese Anfrage hier abgesetzt:


```
PreparedStatement pstmt = connection.prepareStatement(
    			"SELECT * FROM players ORDER BY ? asc");
    			   pstmt.setString(1, argS);
```

Wenn ich das Fragezeichen durch einen festen Wert ersetzte, funktioniert es ohne Probleme.
Wenn ich argS als Parameter einsetze, krieg ich diese Fehlermeldung:


```
Cannot be in ORDER BY clause in statement [SELECT * FROM players ORDER BY ? asc]
```


Kann mir da jemand weiterhelfen?


----------



## DP (5. Apr 2007)

sollte gehen. poste mal den code der danach kommt.

und wer wirft die fehlermeldung?!


----------



## marvin42 (5. Apr 2007)

Ganze Funktion:


```
public void playersOrderBy(String argS)
    {
    	int count = 0;
        
    	System.out.println("In DAO - playersOrderBy");
    
    	try
        {
    		System.out.println("argS: " + argS);
    			PreparedStatement pstmt = connection.prepareStatement(
    			"SELECT * FROM players ORDER BY positionP asc");          // mit Konstante -> funktioniert
    	//		 ..."SELECT * FROM players ORDER BY ? asc");
       //                    pstmt.setString(1, argS);    -> Fehlermeldung
    			
    	

            ResultSet rs = pstmt.executeQuery();

            while (rs.next())
            {
            	count++;
            	
                Spieler s = new Spieler();
                s.setFirstName(rs.getString("firstName"));
                s.setLastName(rs.getString("lastName"));
                s.setTeamID(rs.getInt("teamID"));
                s.setPositionP(rs.getString("positionP"));
                s.setSpielerID(rs.getInt("spielerID"));
                
                spielerListe.add(s);
                System.out.println("count: " + count);
            }            
            
            System.out.println("count: " + count + " - spielerListe.size(): " + spielerListe.size());
            
            
        }
    	
    	catch (SQLException e)
        {
            System.out.println("pstmt-Catch: " + e);
        }
    	
    	Object[][]argum = new Object[count][5];
    	String[] s = { "firstName", "lastName", "teamID", "position", "spielerID" };
    	
    	try
    	{
	    	for(int a = 0; a < count; a++)
	    	{
	    		argum[a][0] = new String(spielerListe.get(a).getFirstName());
	    		argum[a][1] = new String(spielerListe.get(a).getLastName());
	    		argum[a][2] = new Integer(spielerListe.get(a).getTeamID());
	    		argum[a][3] = new String(spielerListe.get(a).getPositionP());
	    		argum[a][4] = new Integer(spielerListe.get(a).getSpielerID());
	    	}
		
	    	gui.editTable(count, 5, s, argum);
    	}
    	
    	catch(Exception e)
    	{
    		System.out.println("Exception in for-Schleife oder editTable: " + e);
    	}
    }
```


----------



## marvin42 (5. Apr 2007)

Beispiel für einen Aufruf:


```
else if(data[s].equals("Position"))
			dao.playersOrderBy(new String("positionP"));
```

Wie gesagt, wenn ich jetzt positionP statt dem Platzhalter ? einfüge, funktioniert die Abfrage.


----------



## DP (5. Apr 2007)

was ist das denn für ne datenbank?!


----------



## marvin42 (5. Apr 2007)

Ist das eine rhetorische Frage?^^

Ich hab mir auch argS ausgeben lassen, also den String, der hier eingesetzt wird. Stimmt auch. Bin also ziemlich ratlos. :?


----------



## DP (5. Apr 2007)

ne, ist es mysql oder access oder sonstiges?!


----------



## marvin42 (5. Apr 2007)

[Edit] Könnte es HSQL sein? Ich weiß nicht so genau, wir haben so ein Datenbanktool von der Schule bekommen (HSQL Database Manager/Server).


Es wird immer besser....

PreparedStatement pstmt = connection.prepareStatement(
    			"SELECT * FROM players WHERE ? like 'Guard'");
    			   pstmt.setString(1, argS);

...bei argS = positionP: 0 Treffer
...dasselbe, nur pstmt.setString auskommentiert und positionP statt dem ?: fünf Treffer. 

 ???:L


----------



## DP (5. Apr 2007)

keine ahnung. unter mysql funktioniert das problemlos. schmeiss den dreck weg und nimm ne gescheite datenbank wie access  :lol:


----------



## marvin42 (5. Apr 2007)

Laut Wikipedia:

"HSQL ist eine vollständig in Java programmierte relationale SQL-Datenbank (RDBMS)...."

Das Problem ist, dass ich diese Datenbank von der Schule aus benutzen muss, abgesehen davon muss das doch auch mit dieser dummen Datenbank funktionieren. Hilfe? Irgendwo? Irgendwer?  :x


----------



## DP (5. Apr 2007)

naja, du kannst es so machen:


```
Strign order_by = "spalte";
Connection con...;
Statement stmt = con.createStatement();
String sql = "select x from y order by " + order_by + " asc";
ResultSet rs = stmt.executeQuery(sql);
```


----------



## marvin42 (5. Apr 2007)

Thx, jetzt klappts!

Ist zwar irgendwie seltsam, aber was solls.


----------



## SlaterB (6. Apr 2007)

mit dem ? kann es nicht funktionieren, 
mit ? kannst du nur Werte übergeben, keine Spaltennamen


----------



## DP (6. Apr 2007)

SlaterB hat gesagt.:
			
		

> mit dem ? kann es nicht funktionieren,
> mit ? kannst du nur Werte übergeben, keine Spaltennamen



funktioniert bei mysql problemlos.


----------



## SlaterB (6. Apr 2007)

hmm, bei mir gehts nicht, hab noch nie davon gehört, 
aber ein Gegenbeweis ist das natürlich nicht 

hast du das wirklich ernsthaft getestet?

> Cannot be in ORDER BY clause in statement
bekomme ich allerdings auch nicht,

sondern
SQL order by ? desc
setString "id"
-> order by 'id' desc

SQL where ? = 5
setString "id"
-> where 'id' = 5

was beides recht sinnlos ist, 
das zweite ist natürlich ein normaler JDBC-?-Ersetzungsvorgang, der ja oft gebraucht wird,
wie sollte JDBC da unterscheiden ob ein Wert oder ein Spaltenname gemeint ist?

beim Order By kann ich mir das auch nicht vorstellen..


----------



## DP (6. Apr 2007)

```
PreparedStatement p1 = con.prepareStatement("select * from customers order by ? desc limit 10");
      p1.setString(1, "customers_id");
      ResultSet r1 = p1.executeQuery();

      while(r1.next()){
        System.out.println(r1.getString("customers_id"));
      }

      p1 = con.prepareStatement("select * from customers order by ? asc limit 10");
      p1.setString(1, "customers_id");
      r1 = p1.executeQuery();

      while(r1.next()){
        System.out.println(r1.getString("customers_id"));
      }
```


```
9743226
9743225
9743224
9743223
9743222
9743221
9743220
9743219
9743218
9743217
1
2
4
5
6
13
14
17
18
20
```


----------



## SlaterB (6. Apr 2007)

wenn es so ist, dann ist es so, 
bei Order By wirds schwierig mit einem Gegenbeispiel,


aber bei WHERE kann es doch auch bei dir nicht funktionieren oder?
bei einer Tabelle mit Spalten name1 und name2,
wie sollte das Programm da bei

WHERE name1 = ?
setString(1,"name2") 

reagieren?
es macht ja beides Sinn, zum einen die Frage nach dem festen Wert 'name2',
zum anderen der Vergleich der beiden Spalten..


----------



## DP (7. Apr 2007)

```
PreparedStatement p1 = con.prepareStatement("? ? ? ? ? ? ? ? ? ?");
      p1.setString(1, "select");
      p1.setString(2, "*");
      p1.setString(3, "from");
      p1.setString(4, "tabelle");
      p1.setString(5, "order");
      p1.setString(6, "by");
      p1.setString(7, "spalte");
      p1.setString(8, "desc");
      p1.setString(9, "limit");
      p1.setString(10, "10");
```


----------



## SlaterB (7. Apr 2007)

ich sehe hier eindeutig einen Verstoß gegen alle PREPARE-Reichtlinien,
gebe mich aber zufrieden


----------

