Avatar billede scarface335 Nybegynder
04. oktober 2006 - 13:41 Der er 15 kommentarer og
1 løsning

Hjælp til sql sætning

Jeg har en Tabel der Hedder Vare, som har en kollone der hedder Nummer,

Jeg skal lave en sætning der henter alt fra vare hvor Nummer starter med 13, hvordan gøres det?

MVH

Jes Gudiksen
Avatar billede lorentsnv Nybegynder
04. oktober 2006 - 13:43 #1
Select *
from Vare
where left(cast(Nummer as varchar(100),2) = '13'
Avatar billede lorentsnv Nybegynder
04. oktober 2006 - 13:43 #2
Der manglet en parantes

Select *
from Vare
where left(cast(Nummer as varchar(100)),2) = '13'
Avatar billede sw_red_6 Nybegynder
04. oktober 2006 - 13:44 #3
noget i stil med SELECT * FROM Vare WHERE Nummer LIKE 13%
Avatar billede lorentsnv Nybegynder
04. oktober 2006 - 13:45 #4
Muligvis kan du også gøre følgende, afhængig af om en cast til varchar(2) tager de to første eller to sidste tegn. Jeg vil tro den tar de to første, go så skulle du kune gøre:

Select *
from Vare
where cast(Nummer as varchar(2)) = '13'
Avatar billede scarface335 Nybegynder
04. oktober 2006 - 13:57 #5
Jeg skal lige sige At Nummer meget ikke sigende er en VarChar virker det så stadig lorentsnv ?
Avatar billede lorentsnv Nybegynder
04. oktober 2006 - 14:00 #6
Så skal du kun bruge:

Select *
from Vare
where left(Nummer,2) = '13'
Avatar billede lorentsnv Nybegynder
04. oktober 2006 - 14:03 #7
Det er ingen grund til at konvertere (Cast), når Nummer er VarChar, så det hurtigste vil jeg mene vil være at bruge en LEFT, for at hente de to første tegn. Dette er hurtigere end at bruge LIKE.
Avatar billede scarface335 Nybegynder
04. oktober 2006 - 15:19 #8
Tak det virker, smid et svar of få dine point.

Og Takker mange gange for hjælpen
Avatar billede lorentsnv Nybegynder
04. oktober 2006 - 15:22 #9
svar :-)
Avatar billede scarface335 Nybegynder
04. oktober 2006 - 15:35 #10
Stadig kun en kommentar
Avatar billede lorentsnv Nybegynder
04. oktober 2006 - 15:44 #11
Vi prøver igen :-)
Avatar billede janus_007 Nybegynder
04. oktober 2006 - 22:46 #12
En left er under ingen omstændigheder hurtigere end en like og specielt ikke når der skal søges efter noget "der starter med"!
En left, right whatever function på venstresiden vil altid resultere i en fulltablescan hvilket gør den rimelig tung :-)
Avatar billede lorentsnv Nybegynder
05. oktober 2006 - 21:38 #13
>janus 007: Du har delvist ret.
Jeg har testet lidt på en tabel med 141000 records, og execution plan er stort set lig både med like og where. Når jeg lægger et index på det aktuelle tekstfelt som jeg søger på, bruger SQL Server 2005 indexet både ved  brug af like og ved brug af where. Jeg har derfor ikke kunne måle den store forskel, men Estimated CPU cost og Estimated I/O cost er lavere ved brug af like i forhold til where.

Den hurtigste forespørgsel vil derfor nok være:
Select *
from Vare
where Nummer = '13%'

Så læret jeg noget nyt i dag også!! ;-)
Avatar billede scarface335 Nybegynder
06. oktober 2006 - 11:56 #14
Og for til slut at kommentere Jeres diskusion har jeg testet disse tre sætninger:
1.Select * From Vare Where Left (Nummer, TextBox2.Text.Lenght) = @medarbejderId;
2.Select * From Vare Where Nummer Like @medarbejderId%;
3.Select * From Vare Where Nummer = @medarbejderId%;

It mit eksempel er query 1 den hurtigste og samtidig den eneste der i alle Test resultater returnerede det rigtige :-)
Avatar billede scarface335 Nybegynder
06. oktober 2006 - 11:57 #15
Det er nemlig ikke i alle tilfælde at medarbejder id er på 2Char; derfor ser qurey 1. ud som den gør
Avatar billede janus_007 Nybegynder
07. oktober 2006 - 12:00 #16
lorentsnv-> Når du siger ved brug af like og where, mener du så where som i :
Select *
from Vare
where left(cast(Nummer as varchar(100),2) = '13' ?



Scarface -> Det er godt du finder den sql der lige passer ind i dit scenerie, så er opgaven løst bedst muligt - ingen tvivl om det. At de ikke returnerer det korrekte er nok en anden snak ;-)

Men jeg kan garantere for at et funktionskald på venstresiden vil resultere i fulltablescan, årsagen er at SQL jo ikke kan indexere funktionskaldet, men kun den originale værdi. Hvis tabellen er stor nok til at queryoptimizeren vurderer at indexet er anvendeligt vil en left give et dårligere resultat ligegyldigt hvad.... Men ved små datamængder vil forskellen nok ikke være den store, derfor er det bedste også som du har gjort... nemlig at teste :-)
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