# mssql: Query erkennt String mit Bindestrich nicht (SQLServer 2008)



## DrBonsai (3. Mai 2010)

Hallo,

vorweg: Ich nutze mssql-Server2008

Ich habe eine Variable, die folgenden string enthält:
"ACOPLE TORRES 3000 -PUNTERA-"
Jetzt möchte ich die Referenz dieses String aus meiner mssql-Tabelle fischen. Ganze einfach Abfrage:

```
select ref from st where design = 'ACOPLE TORRES 3000 -PUNTERA-'
```

Allerdings liefert das kein ergebnis zurück. Erst wenn ich die Bindestriche aus der Query nehme, kommt meine Referenz zurück.

(So: 
	
	
	



```
select ref from st where design LIKE 'ACOPLE TORRES 3000 %'
```
)

Ich kann aber nicht den String immer abschneiden, da dann ggf auch mal mehrdeutige strings entstehen.

Weiß jemand woran das liegt, bzw. wie ich es abstellen kann?

mfg,
David


----------



## Xervos (3. Mai 2010)

Hallo,

Versuche es mal Mit upper()


```
select ref from st where Upper(design) = upper('ACOPLE TORRES 3000 -PUNTERA-' );
```

vll geht es so ? 

du musst auch aupassen wenn du nur ein leerzeichen mehr in deiner Anbfrage hast als in deiner Tabelle, kommt da auch nichts zurück 


Das könntest du aber mit TRIM() umgehen. 


```
select ref from st where Trim(Upper(design)) = Trim(upper('ACOPLE TORRES 3000 -PUNTERA-' ));
```

lg


----------



## DrBonsai (3. Mai 2010)

Xervos hat gesagt.:


> Versuche es mal Mit upper()
> [...]
> lg



Hallo,
danke.
Klappt aber nicht.

"Upper" dreht mir ja auch nur Kleinbuchstaben in Großbuchstaben um. Mein String ist aber exakt so geschrieben, wie in der DB.

mfg,
David


----------



## Xervos (3. Mai 2010)

Hast du schon Trim versucht ? 

ist das was in der - - steht immer anders ?


----------



## DrBonsai (3. Mai 2010)

Xervos hat gesagt.:


> Hast du schon Trim versucht ?


"Trim" scheint es in mssql nicht zu geben. Dafür aber "ltrim" und "rtrim". Habs beides versucht!

```
select ref from st where ltrim(rtrim(Upper(design))) = ltrim(rtrim(upper('ACOPLE TORRES 3000 -PUNTERA-' )));
```
und es kommt nichts dabei raus.


Xervos hat gesagt.:


> ist das was in der - - steht immer anders ?



Der ganze String ist immer anders. Das kann mal der genannte sein, oder auch "Chumbadouro p/tronco piramidal 20M p/montagem de aerogerador" oder vllt. in Zukunft auch mal "hjsdfsdas", wenn jemand ein Produkt mit diesem Namen entwickelt.

mfg,
David


----------



## Xervos (3. Mai 2010)

Hallo 

versuchs mal so 

select ref from st where design = 'ACOPLE TORRES 3000 \-PUNTERA\-'  

Mit hilfe des Backslash nimmt SQL das sonderzeichen wörtlich


----------



## DrBonsai (3. Mai 2010)

Nope,
das haut auch nicht hin. Habe noch was merkwürdiges entdeckt:
Folgendes gibt bei einem anderen Produkt die richtige Referenz zurück 

```
select * from st where design LIKE 'Bomba calor agua-agua IS-WW 12 (com arrefecimento)'
```
Ein weiteres Produkt der gleichen Reihe (mit fast identischem Namen) liefert aber kein Ergebnis

```
select * from st where design LIKE 'Bomba calor agua-agua IS-WW 8 (com arrefecimento)'
```

Das kann doch eigentlich gar nicht sein.


----------



## Nord-Süd-Richtung (3. Mai 2010)

Hi

probier doch mal "=" statt LIKE


----------



## DrBonsai (3. Mai 2010)

Hab ich schon in sämtlichen Kombinationen durch.

Ich raffs nicht. Eigentlich müsste es hinhauen, mit Allem, was du so vorgeschlagen hast.


----------



## Xervos (3. Mai 2010)

Wer ich oder Nord Süd? 

Hmm ich habe mir jetzt mal eine Mysql aufgesetzt 

das bekomme ich raus 

http://img19.imageshack.us/img19/3618/sql.png

mach mal bitte ein select * from st und poste was du da hast


----------



## Xervos (3. Mai 2010)

OK sry Trim gibt es beim mssql-Server2008 nicht 

übersehen


----------



## DrBonsai (3. Mai 2010)

Xervos hat gesagt.:


> Wer ich oder Nord Süd?



Hab alles mit Allem kombiniert. Also deine Vorschläge mit "=" und "LIKE"


Xervos hat gesagt.:


> mach mal bitte ein select * from st und poste was du da hast



Was willst du denn sehen.

Hab ne tabelle mit 115 Spalten und 3826 Zeilen...

Oder versteh ich nicht richtig, was du meinst mit "und poste was du da hast"?

Wenn ich "trim" setze, kommt die Nachricht

"Msg 195, Level 15, State 10, Line 4
'Trim' is not a recognized built-in function name."


----------



## Xervos (4. Mai 2010)

Achso du hast soviele einträge. Wollte ein paar in meine Tabelle geben zum Nachspielen.

Hmm naja MS SQL unterstützt kein Trim was mir aber nicht unbedingt einleuchtet aber ok. Muss es eine MS SQL Datenbank sein ?


----------



## DrBonsai (4. Mai 2010)

Xervos hat gesagt.:


> Achso du hast soviele einträge. Wollte ein paar in meine Tabelle geben zum Nachspielen.
> 
> Hmm naja MS SQL unterstützt kein Trim was mir aber nicht unbedingt einleuchtet aber ok. Muss es eine MS SQL Datenbank sein ?



Guten Morgen,

Die meisten Einträge findet meine stinknormale Query ja. Ich hab auch andere Einträge mit Sonderzeichen, die werden alle wunderbar erkannt. Das ist ja das Kranke an der Sache.

Ja, es muss mssql sein. Das Projekt ist eigentlich fertig und nicht gerade ein kleiner Codeschnipsel. Außerdem hängen an der Datenbank auch noch andere Applikationen, die teilweise viel Geld gekostet haben. Also mal eben die DB wechseln ist nicht drin.

mfg,
David

EDIT:
Hab mal das Produkt umbenannt in der Datenbank und es wurde gefunden. Habs dann wieder auf den ursprünglichen Namen zurück gesetzt und es wird immer noch gefunden.Ich habe keinen Plan, was das jetzt soll. Ich habe folgende Theroie:

Das Produkt stand mit mehr als einem Leerzeichen in der Datenbank. Wenn man sich den Namen ausgeben läst, erscheint aber nur ein Leerzeichen (so etwas, wie ein automatisches Trim bei der Ausgabe.) Sucht man dann nach dem Proukt, mit nur einem Leerzeichen, dann gibt es kein Ergebnis zurück.

Problem gelöst, wenn's auch bedeutet, dass ich wohl die ganzen Produktnamen durchgehen und auf mehrere Leerzeichen durchsuchen muss.

mfg,
David

Schönes Wochenende


----------



## Alex F. (5. Mai 2010)

Nein musst du nicht genau hierfür gibt es im SQL Server LTRIM und RTRIM also wenn du Leerzeichen abschneiden willst dann benutze die.
Leider habe ich den Post zu spät gesehen sonst wärst du vermutlich früher am Ziel gewesen.
Zu den MySQL Usern die beklagen das es kein Trim gibt - dafür gibt es im MSSQL sogar 2 ( s.o.). Wenn man also weiß was man tut kommt man damit auch klar.
Grüsse Alex

PS: Solltest du auch mehrfache Leerzeichen zwischen den Texten haben      wie hier dann ersetzte einfach mit REPLACE ( SPALTE, "  ". " ")  bis es passt


----------



## Xervos (5. Mai 2010)

Alex F. hat gesagt.:


> Nein musst du nicht genau hierfür gibt es im SQL Server LTRIM und RTRIM also wenn du Leerzeichen abschneiden willst dann benutze die.
> Leider habe ich den Post zu spät gesehen sonst wärst du vermutlich früher am Ziel gewesen.
> Zu den MySQL Usern die beklagen das es kein Trim gibt - dafür gibt es im MSSQL sogar 2 ( s.o.). Wenn man also weiß was man tut kommt man damit auch klar.
> Grüsse Alex
> ...



Hallo 

aber RTRIM und LTRIM wird im nichst helfen wenn das Leerzeichen irgendwo in der Mitte ist oder ? das schneidet doch nur die Leerzeichen am ende und anfang ab. Habe ich ja schon mal ein Paar Post vorher geschrieben er soll das benutzen. 

Das Replace wäre noch eine idee. 

Generell ist zu sagen das ein Vergleich von Strings immer Blöd ist (ich versuche das immer zu vermeiden) da wie du siehst ein leerzeichen deine Abfrage schon scheitern lassen kann. 

lg


----------



## DrBonsai (5. Mai 2010)

Alex F. hat gesagt.:


> Nein musst du nicht genau hierfür gibt es im SQL Server LTRIM und RTRIM also wenn du Leerzeichen abschneiden willst dann benutze die.
> Leider habe ich den Post zu spät gesehen sonst wärst du vermutlich früher am Ziel gewesen.
> Zu den MySQL Usern die beklagen das es kein Trim gibt - dafür gibt es im MSSQL sogar 2 ( s.o.). Wenn man also weiß was man tut kommt man damit auch klar.
> Grüsse Alex
> ...



Hallo,
danke für deine Hilfe.

LTRIM und RTRIM hatte ich ja schon zusammengelegt. Aber wie du richtig erkannt hast, was mein Problem ja bei den Leerzeichen zwischen den Elementen meines Tabelleneintrags.

Wunderbar, mit replace kann ich dann also einfach lustig Leerzeichen entfernen.

Ich habe mal gegoolget, nach einer Möglichkeit meine Leerzeichen nicht direkt zu löschen, sondern sie einfach bei meiner Abfrage nicht zu bercksichtigen.

Das müsste meiner Meinung nach ungefähr so gehen:

select REPLACE (ref, '  ', ' ')  from st where ref = 'Bomba calor geotermica IS-SW 29 (sem arrefecimento)'

Das klappt aber nicht. Ich bekomme die Nachricht:
Kein Spaltenname

Hsat du da nen schnellen Tipp für mich?

mfg,
DAvid


----------



## Xervos (5. Mai 2010)

DrBonsai hat gesagt.:


> Hallo,
> danke für deine Hilfe.
> 
> LTRIM und RTRIM hatte ich ja schon zusammengelegt. Aber wie du richtig erkannt hast, was mein Problem ja bei den Leerzeichen zwischen den Elementen meines Tabelleneintrags.
> ...



Ähmm nur zur info ich habe dir das mit den Leerzeichen schon vorher mal gesagt !



> Hallo,
> 
> Versuche es mal Mit upper()
> 
> ...



lg


----------

