Avatar billede MortenGrue Nybegynder
10. april 2012 - 18:46 Der er 7 kommentarer

Whitespace som ikke er mellemrum i starten af et felt

Jeg sider med et problem som burde være lige til og simpelt, men jeg  har godt nok støt hovedet mod en mur og håber der er nogle her på eksperten som kan hjælpe.

Jeg har nogle vare med OEM nummer, og disse vare kommer ind fra mange forskellige leverandører, men nogle af dem har den uvane at sende en eller anden form for Whitespace med foran deres OEM nummer. og da det ikke er et mellemrum kan jeg ikke bare fjerne det med LTRIM(). Der er en del af disse men jeg har lige taget et eksempel ud og se på:
SELECT Oemnr, Producent
  FROM lev.dbo.VareListe
  WHERE Oemnr LIKE '%MD258'
 
SELECT Oemnr, Producent
  FROM lev.dbo.VareListe
  WHERE Oemnr LIKE ' %'
 
SELECT Varenummer, Oemnr, Producent
  FROM lev.dbo.Prisfiler
  WHERE Oemnr LIKE '%MD258'
 
SELECT Varenummer, Oemnr, Producent
  FROM lev.dbo.Prisfiler
  WHERE Oemnr LIKE ' %'

Det giver følgende 4 resultater:
Oemnr    Producent
MD258    Apple
MD258    Apple

Oemnr            Producent
980-000056    Logitech
CLP-C660B/ELS  SAMSUNG                     
NERO10OEM    Nero
TN2000        BROTHER       

Varenummer    Oemnr    Producent
553714            MD258    Apple
MD258            MD258    Apple 

Varenummer    Oemnr                    Producent
37TEK008R13023    008R13023          TEKTRONIX                   
LOG980000056    980-000056            Logitech
32SAM660C        CLP-C660B/ELS      SAMSUNG                     
CM016459    Electric Orange    CaseMate
EB-K1A2EBEGSTD    Galaxy S II            Samsung
ECR-D1A2BEGSTD    Galaxy S II            Samsung
EIA2UHUNBECSTD    Galaxy S II            Samsung
ET-R205UBEGSTD    Galaxy S II            Samsung
EB-K1A2EWEGSTD    Galaxy S II White    Samsung
DLM1399/10    iPhone 4. Neoprene Case    Philips
DLP2272/10    iPhone/iPod            Philips
DLP2281/10    iPhone/iPod            Philips
5202              NERO10OEM            Nero
370265              THZ03403EU            Targus
31BROTN2000      TN2000            BROTHER                     
X560H2KG    X560H2KG            LEXMARK   

(Nu har jeg lige tilføjet en lille smule ekstra whitespace der hvor det ikke er relevant, bare for at gøre det mere læseligt)

Men som man kan se er der to OEMnr "MD258" og " MD258" som er forskellige, men den sidste dukker ikke op i en søgning efter LIKE ' %', altså må det være noget andet som ligger der, jeg kan bare ikke finde ud af hvad. Jeg har prøvet med ALT+255 og ALT+0160 samt /n/r og tab, det gør mig heller ikke istand til at finde disse irreterende Whitespaces...

Håber der er nogle som kan hjælpe!
Avatar billede Syska Mester
10. april 2012 - 19:06 #1
Kan du ikke læse dem ud i din app og finde ud af hvad char værdien er?

Ellers må du substring den og konvertere det du ikke kan  læse med: select ascii(' ')

I hvert fald en mulighed :-)
Avatar billede MortenGrue Nybegynder
10. april 2012 - 20:01 #2
Hej Buzzzz

Jeg har ikke rigtig noget sted jeg hiver det du, det skal bare arbejde bag scenen og lave en "intelligent" pris fastsætning, så det eneste output er et tal mellem 1,25 og 1,75 :)

Problemet med at lave en sub string er at jeg ikke kan gøre det på alle rækker og der er et sted mellem 3 og 6 tusinde ud af 160 tusinde hvor det her problem er tilstede, så jeg ikke kan lave en query der finder dem (som jeg forsøgte at visse med ' %' søgningerne)
Avatar billede mireigi Novice
11. april 2012 - 22:55 #3
Kan du ikke bruge noget i stil med dette?
http://forums.devshed.com/ms-sql-development-95/sql-regex-replace-how-to-425646.html

Det er post #5 du skal have fat i, omhandlende RegEx.
Så kan du lave en update, hvor du erstatter ugyldige tegn gennem en RegEx.

RegEx'en kunne se ud som denne:
[^\w\d]+


Det burde finde alle tegn der IKKE er et tal, bogstav eller gængse punkttegn (punktum, komma, underscore, bindestreg).
Avatar billede arne_v Ekspert
16. april 2012 - 02:54 #4
Siden SQLServer 2005 er der da forhaabntligt ikke nogen som bruger den metode.

Fra den version af kan man lave CLR UDF !

Det er ret nemt at kode i C#.

:-)
Avatar billede arne_v Ekspert
16. april 2012 - 03:15 #5
Kode:


using System;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using System.Text.RegularExpressions;

using Microsoft.SqlServer.Server;

namespace E
{
    public class RR
    {
        [SqlFunction]
        public static SqlString RegexReplace(string s, string pat, string rpl)
        {
            return Regex.Replace(s, pat, rpl);
        }
    }
}


1> CREATE ASSEMBLY rr FROM 'C:\Work\rr.dll' WITH PERMISSION_SET = SAFE
2> GO
1>
2> CREATE FUNCTION REGEXREPLACE(@s NVARCHAR(50), @pat NVARCHAR(50), @rpl NVARCHAR(50))
3> RETURNS NVARCHAR(50)
4> AS
5> EXTERNAL NAME rr.[E.RR].RegexReplace
6> GO
1>
2> SELECT DBO.REGEXREPLACE('XA B C 1 2 3X', '[^A-Z]', '')
3> GO

--------------------------------------------------
XABCX

(1 row affected)
1> SELECT DBO.REGEXREPLACE('A12B34C', '\d+', '$0.0')
2> GO

--------------------------------------------------
A12.0B34.0C

(1 row affected)
1>
2> DROP FUNCTION REGEXREPLACE
3> GO
1>
2> DROP ASSEMBLY rr
3> GO
Avatar billede MortenGrue Nybegynder
25. april 2012 - 11:20 #6
Tak for svaret Arne_v, du må undskylde det tog mig så lang tid at svare, men har været optaget af andre problemer :)


Det har løst problemet med det mystiske tegn!
Avatar billede arne_v Ekspert
02. maj 2012 - 04:07 #7
Var det en opfording til at smide et svar for den CLR UDF?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester