/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
SQL der kan fange brugeres stavefejl :-)
Fra : Jakob Andersen


Dato : 16-05-02 15:47

Jeg sidder og udvikler en ver. 2 af en applikation og et af de store
problemer i ver. 1 er at brugerne er gode til at taste forkert og derved
skabe redundant data i databasen og gøre det umuligt at føre en fornuftig
statistik.

Nu er der blevet ryddet op i dataene manuelt og jeg tænkte så at jeg ville
gøre mit til at mine kollegaer ikke skulle igennem den oprydning igen, det
er blevet til følgende T-SQL (Jeg bruger SQL Server 2000) hvor jeg prøver at
finde forekomster der muligvis kunne være det der mentes i indtastningen:

DECLARE @Ord nvarchar(100)
SELECT @Ord = 'Sekretær'

DECLARE @OrdLaengde int
SELECT @OrdLaengde = LEN(@Ord)

IF (SELECT COUNT(*) FROM tblPersonTitler WHERE Titel = @Ord) <> 1 THEN
BEGIN
SELECT Titel FROM tblPersonTitler WHERE Titel LIKE ('%'+
SUBSTRING(@Ord, 0, @OrdLaengde/2) + '%')
UNION
SELECT Titel FROM tblPersonTitler WHERE Titel LIKE
('%'+SUBSTRING(@Ord, @OrdLaengde/2, @OrdLaengde/2) + '%')
END
ELSE
BEGIN
SELECT Titel FROM tblPersonTitler WHERE Titel = @Ord
END

Er der nogle der har nogle forslag da ovenstående jo ikke just er smukt.
--
Jakob Andersen



 
 
Nis Jorgensen (16-05-2002)
Kommentar
Fra : Nis Jorgensen


Dato : 16-05-02 18:04

On Thu, 16 May 2002 16:47:16 +0200, "Jakob Andersen" <jta@advice.dk>
wrote:

>Jeg sidder og udvikler en ver. 2 af en applikation og et af de store
>problemer i ver. 1 er at brugerne er gode til at taste forkert og derved
>skabe redundant data i databasen og gøre det umuligt at føre en fornuftig
>statistik.
>
>Nu er der blevet ryddet op i dataene manuelt og jeg tænkte så at jeg ville
>gøre mit til at mine kollegaer ikke skulle igennem den oprydning igen, det
>er blevet til følgende T-SQL (Jeg bruger SQL Server 2000) hvor jeg prøver at
>finde forekomster der muligvis kunne være det der mentes i indtastningen:
>
>DECLARE @Ord nvarchar(100)
>SELECT @Ord = 'Sekretær'
>
>DECLARE @OrdLaengde int
>SELECT @OrdLaengde = LEN(@Ord)
>
>IF (SELECT COUNT(*) FROM tblPersonTitler WHERE Titel = @Ord) <> 1 THEN
> BEGIN
> SELECT Titel FROM tblPersonTitler WHERE Titel LIKE ('%'+
>SUBSTRING(@Ord, 0, @OrdLaengde/2) + '%')
> UNION
> SELECT Titel FROM tblPersonTitler WHERE Titel LIKE
>('%'+SUBSTRING(@Ord, @OrdLaengde/2, @OrdLaengde/2) + '%')
> END
>ELSE
> BEGIN
> SELECT Titel FROM tblPersonTitler WHERE Titel = @Ord
> END
>
>Er der nogle der har nogle forslag da ovenstående jo ikke just er smukt.

Altså: Hvis @ord findes i tblPersonTitler, skal det returneres
uaendret, ellers skal der returneres den titel der "ligner mest".

Jeg ville skrive en funktion "Similar" der sammenlignede to strenge og
returnerede et tal der angav "hvor meget de lignede hinanden". Saa
kunne du bruge noget i retning af:

SELECT
COALESCE(
SELECT Titel
FROM tblPersonTitler
WHERE Titel = @Ord
,
SELECT Titel
FROM tblPersonTitler
ORDER BY Similar(@Ord, Titel), Titel
LIMIT 1
)


Hmmm, er LIMIT mon standard?

PS: Du behøver ikke illustrere "redundant" yderligere.
--
Nis Jorgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Jakob Andersen (16-05-2002)
Kommentar
Fra : Jakob Andersen


Dato : 16-05-02 22:29

"Nis Jorgensen" <nis@dkik.dk> wrote in message
news:hoo7euon2doneseip2et9nn531l9r8g4cd@4ax.com...
> Jeg ville skrive en funktion "Similar" der sammenlignede to strenge og
> returnerede et tal der angav "hvor meget de lignede hinanden". Saa
> kunne du bruge noget i retning af:

Det er netop "similar" funktionen jeg fiflede med, mit umiddelbare
(fantasiløse) bud var at lave en like med første halvdel af ordet og
bagefter en like sammenlignet med sidste halvdel af ordet, dette virker også
fint nok men giver bare ofte for mange resultater og er heller ikke særlig
elegant.

Hvis bare jeg kunne få et stikord til hvordan man lidt mere elegant kan
finde ud hvor meget to ord ligner hindanden. Jeg har selv rodet med tanken
om at sammenligne karakter1 fra streng1 med karakter1 fra streng2 osv. men
hvis folk så skriver forkert sådan her:

"dsysadm" istedet for "sysadm" bliver dette jo overhovedet ikke ens hvis man
sammenligner d med s, s med y osv.

> Hmmm, er LIMIT mon standard?

Den er muligvis standard men virker ikke i MS SQL, her kan man dog i nogle
tilfælde bruge

SELECT TOP x felt1, .... feltn FROM tabel

for at få returneret x poster

> PS: Du behøver ikke illustrere "redundant" yderligere.

Det må i undskylde, der var lige problemer med nyhedsserveren.

--
Jakob Andersen



Jens Gyldenkærne Cla~ (16-05-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 16-05-02 22:48

"Jakob Andersen" <jakob@effectus.dk> skrev:

> Det må i undskylde, der var lige problemer med nyhedsserveren.

Der er på det seneste kommet en hel del dobbeltindlæg fra
forskellige Sunsitebrugere (mig selv inkl.), fordi Sunsite-serveren
har været særdeles langsom, og mange derfor har prøvet at sende
samme indlæg flere gange.

Sunsites link har været overbelastet pga. massive download af
RedHat - se forklaring i news:sunsite.staff (Message-ID:
<867km412li.fsf@karthy.karthy.net> - formentlig kun tilgængelig på
sunsiteserveren)

Det der tager virkelig lang tid er at få bekræftet at et indlæg er
sendt. Men selv om den ikke dukker op, er indlægget alligevel ofte
kommet frem (indtil videre jeg har ikke oplevet det modsatte) - så
det er altså ikke nødvendigt at sende igen.


XFUT: dk.edb.internet.software.mail+news
--
Jens Gyldenkærne Clausen
MF (Medlem af Fiduso - www.fiduso.dk)

Jakob Andersen (16-05-2002)
Kommentar
Fra : Jakob Andersen


Dato : 16-05-02 22:50

"Jens Gyldenkærne Clausen" <gyros@email.dk> wrote in message
news:Xns9210F207F2749jgcnospamget2netdk@212.242.40.196...
> Det der tager virkelig lang tid er at få bekræftet at et indlæg er
> sendt. Men selv om den ikke dukker op, er indlægget alligevel ofte
> kommet frem (indtil videre jeg har ikke oplevet det modsatte) - så
> det er altså ikke nødvendigt at sende igen.

Jeg sendte ikke igen, serveren timede ud da de var ved at blive sendt og jeg
bedte bare outlook om at vente.

--
Jakob Andersen



Jens Gyldenkærne Cla~ (17-05-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 17-05-02 22:22

"Jakob Andersen" <jakob@effectus.dk> skrev:

> Jeg sendte ikke igen, serveren timede ud da de var ved at
> blive sendt og jeg bedte bare outlook om at vente.

O.k. - det er muligt at OE selv prøver igen ved timeouts. På en
eller anden måde er dit indlæg i hvert fald blevet sendt flere
gange.

--
Jens Gyldenkærne Clausen
MF (Medlem af Fiduso - www.fiduso.dk)

Nis Jorgensen (17-05-2002)
Kommentar
Fra : Nis Jorgensen


Dato : 17-05-02 07:56

On Thu, 16 May 2002 23:29:28 +0200, "Jakob Andersen"
<jakob@effectus.dk> wrote:

>"Nis Jorgensen" <nis@dkik.dk> wrote in message
>news:hoo7euon2doneseip2et9nn531l9r8g4cd@4ax.com...
>> Jeg ville skrive en funktion "Similar" der sammenlignede to strenge og
>> returnerede et tal der angav "hvor meget de lignede hinanden". Saa
>> kunne du bruge noget i retning af:
>
>Det er netop "similar" funktionen jeg fiflede med, mit umiddelbare
>(fantasiløse) bud var at lave en like med første halvdel af ordet og
>bagefter en like sammenlignet med sidste halvdel af ordet, dette virker også
>fint nok men giver bare ofte for mange resultater og er heller ikke særlig
>elegant.
>
>Hvis bare jeg kunne få et stikord til hvordan man lidt mere elegant kan
>finde ud hvor meget to ord ligner hindanden. Jeg har selv rodet med tanken
>om at sammenligne karakter1 fra streng1 med karakter1 fra streng2 osv. men
>hvis folk så skriver forkert sådan her:

Her er et par stikord til Google: "similarity metric", "longest common
substring" og "bigrams". Den præcise implementation af begge er lidt
"langhåret". I et af mine prjekter bruger jeg en lettere forsimplet
version af Bigrams, indsat nedenfor i pascal. Ideen er at kigge paa
hver tobogstavs-substring af str1, og se om denne forekommer i str2.


function BiGrams(str1, str2: String):integer;
var
i : Integer;
Hits: Integer;
iLength1, iLength2: Integer;
strTmp : String;
begin
iLength1 := Length(str1);
iLength2 := Length(str2);
if iLength1 > iLength2 then
begin
strTmp := str1;
str1 := str2;
str2 := strTmp;
iLength1 := Length(str1);
iLength2 := Length(str2);
end;
if (iLength1=1) and (iLength2=1) then
begin
if CompareText (str1,str2) <> 0 then
Bigrams := 0
else
Bigrams := 100;
end else begin
Hits := 0;
for i:=1 to iLength1 - 1 do
if (Pos(copy(str1, i, 2), str2) > 0) then
Hits:=Hits+1;
try
i := trunc( ((2*Hits)/((iLength1-1)+(iLength2-1))) *100 );
if i > 100 then
Bigrams := 100
else
Bigrams := i;
except
on eInvalidOp do
begin
Bigrams := 0;
end;
end;

end;
end;




--
Nis Jorgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Jakob Andersen (18-05-2002)
Kommentar
Fra : Jakob Andersen


Dato : 18-05-02 12:34

"Nis Jorgensen" <nis@dkik.dk> skrev i en meddelelse
news:cf99euo3f7t43a10n5a5ef480d9o1hulrr@4ax.com...
> Her er et par stikord til Google: "similarity metric", "longest common
> substring" og "bigrams".

Tak skal du have, vha. dit eksempel og et par søgninger på googler har jeg
nu fået strikket en udmærket funktion sammen.

--
Jakob Andersen



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste