# Rguläre Ausdrücke mit SQL und Java



## steve77 (21. Apr 2008)

Hallo, ich hab da eine frage und zwar geht es darum, ich will ein select-statement schreiben, dass mir einen Zahlenbereich aus einer Datenbank ausgibt. Und zwar soll dies folgender massen aussehen. Z.B: 123456*1233 --> Es sollen alle Zhalen ausgegeben werden, die am Anfang die Zahlen 123456 und am ende die zahlen 1233 haben. Ich habe dies mit regulären ausdrücken gemacht. 


```
String selectRange = "select  * FROM TabelleX where SpalteY REGEXP_LIKE(?.{6}?$)";
```

Wenn ich diese nun aber in einem Datenbanktool teste (z.B . SQirrel), dann bekomm ich immer folgenden fehler:

Error: nicht unterstütztes SQL92-Token in Position ....
SQL-Statement: null, ErrorCode: 17034


Weiss jemand warum das so ist, oder kann mir sagen wie ich das Staement bauen muss, damit es klappt? Danke!!


----------



## steve77 (21. Apr 2008)

sorry, natürlich so:


```
String selectRange = "select  * FROM TabelleX where SpalteY REGEXP_LIKE(123456.{6}1233$)";
```


----------



## maki (21. Apr 2008)

Seit wann versteht SQL regülare Ausdrücke???

where und like reichen für deine Aufgabe bei weitem aus.


----------



## steve77 (21. Apr 2008)

Ich weiss nicht wie lange es das gibt, aber sql kann reguläre ausdrücke auswerten!  Die einfachen abfragen gehen nicht, weil Oder vielleicht doch?... Noch mal zum Beispiel: 123456*1233

Die ersten 6 müssen gegeben sein, es gibt eine untere Grenze, das heisst alle nummern mit 123456 und eine oberer Grenze: also 1233. 
Wie würde das denn mit where und like aussehen?


----------



## maki (21. Apr 2008)

Das ist kein SQL sondern irgendeine Funktion des RDBMS Servers, solltest du nicht verwenden, sonst kannst du nicht mehr umsteigen.

Wie gesagt, das Problem ist mit Standard SQL sehr einfach in den Griff zu kriegen..

WHERE spalte LIKE '123456%1233'

Solltest dich mehr auf SQL konzentrieren anstatt zu versuchen da regex einzusetzen.


----------



## steve77 (21. Apr 2008)

Ja danke, werd ich berücksichtigen  
Ich hab da aber noch eine weitere Frage: Wenn ich das ganze nun mit preparestatements machen will, würde ich das so machen:



```
public String NoEquals(){
		
		String givenNoEquals = null;
		
		try {
			String selectRange = "select  * FROM STORE where No LIKE 123456%1233;
			PreparedStatement stmt = getConnection().prepareStatement(selectRange);
			stmt.clearParameters();
			stmt.setString(1, rangeOfNo.getLow());// der Intervall von
			stmt.setString(2, rangeOfNo.getHigh());//der intervall bis
			ResultSet result = stmt.executeQuery("STORE");
			if (result.next()) {
				givenNoEquals = result.getString("STORE");
			}
		} catch (SQLException sqle) {
			System.out.println("Fehler bei der Datenbankabfrage" + "abfrage:\n"
					+ sqle.getMessage());	
		}
		return givenNoEquals;
```

Ich hoffe, das das so richtig ist. Vielen Dank schonmal für die Hilfe


----------



## steve77 (21. Apr 2008)

Mist schon wieder was vergessen. Natürlich so:

```
String selectRange = "select  * FROM STORE where No LIKE ?%?;
```


----------



## SlaterB (21. Apr 2008)

wenn überhaupt dann nur ein ?
und 
rangeOfNo.getLow() + "%" + rangeOfNo.getHigh())
wirds du dir doch wohl zusammenbauen können?

obs aber mit LIKE funktioniert, wird dir ein Test sagen, kein Forum


----------



## steve77 (21. Apr 2008)

sieht gut aus, aber wie sieht es denn aus wenn beide Werte nicht feststehen. Soll heißen, das der untere Wert zur laufzeit noch nicht feststeht, genauso wie der obere. Diese können also nicht hartcodiert werden. Dann brauche ich doch zwei ? oder nicht?


----------



## SlaterB (21. Apr 2008)

warum zwei '?'? was meinst du damit, dass der untere Wert nicht feststeht?
du kannst doch keine unfertige Query ausführen?

mit nur einem ? bist du dagegen voll flexibel und kannst auch nur
"%" + rangeOfNo.getHigh()
übergeben statt
rangeOfNo.getLow() + "%" + rangeOfNo.getHigh()


----------



## steve77 (21. Apr 2008)

Es sieht folgender massen aus. Ich bekomme eine Liste mit Intervallen, diese soll abgearbeitet werden. Der User gibt z.B. ein ich will alle nummern haben, die mit  123456 anfangen und mit 1233 aufhören, was dazwischen liegt ist erstmal egal. Deswegen sind ja zwei werte unbekannt!


----------



## SlaterB (21. Apr 2008)

das war von Anfang an klar


----------



## steve77 (21. Apr 2008)

halt mich nicht für begriffsstutzig... soll also so aussehen:


```
public String NoEquals(){ 
       
      String givenNoEquals = null; 
       
      try { 
         String selectRange = "select  * FROM STORE where No LIKE ?; 
         PreparedStatement stmt = getConnection().prepareStatement(selectRange); 
         stmt.clearParameters(); 
         stmt.setString(1, rangeOfNo.getLow() + "%" + rangeOfNo.getLow() ); 
          
         ResultSet result = stmt.executeQuery("STORE"); 
         if (result.next()) { 
            givenNoEquals = result.getString("STORE"); 
         } 
      } catch (SQLException sqle) { 
         System.out.println("Fehler bei der Datenbankabfrage" + "abfrage:\n" 
               + sqle.getMessage());    
      } 
      return givenNoEquals;
```


----------



## SlaterB (21. Apr 2008)

besteht eine Frage?


----------



## steve77 (21. Apr 2008)

jo, die besteht, ob das so richtig ist, wie es dort oben steht?


----------



## SlaterB (21. Apr 2008)

da du nicht mehr 2 ? sondern nur noch 1 ? hast, kann ich diese Mecker nicht wiederholen, bin insofern also zufrieden 

obs korrekt läuft zeigt dir ein Klick auf den Run-Button,
das kann ich persönlich leider nicht bezeugen

-----


hinter dem SQL fehlt  ";


----------



## steve77 (21. Apr 2008)

jo scheint zu funktionieren, besten dank!


----------



## Niki (21. Apr 2008)

```
ResultSet result = stmt.executeQuery("STORE");
```

gib das "STORE" raus.
also:

```
ResultSet result = stmt.executeQuery();
```

Ansonsten schaut es recht vernünfigt aus, wobei ich glaub das clearParameters dürfte auch überflüssig sein.


----------

