23. maj 2007 - 16:40Der er
3 kommentarer og 1 løsning
LIKE Statement
Jeg har en tabel der har disse felter: EmployeeID, EmployeeName
Et udsnit af EmployeeName feltet som vi skal bruge:
EmployeeName --------------- Greta Payne Helle Lyngdal Kiraom Andersen Gall Henriksen Michael Rannje Allan Frost Allan Østergaard Henning Tejsner Ove Thuen Søren Palm Erik Foldø Henriette Nanna Vedsø
Jeg vil gerne have en SQL Sætning der kan tælle de navne der har minimum et mellemnavn
Jeg ville jo gerne kunne sige, at det kunne gøres ved at skrive
SELECT COUNT(*) AS PersonerMedMellemnavne FROM dinTabel WHERE UBound(Split(Trim(EmployeeName), ' ')) >= 2
men UBound funktionen kan åbenbart ikke udføres direkte i en forespørgsel, men så kan man jo lave sin egen lille funktion. I et modul kan man oprette en funktion som:
Public Function WordCount(Tekst As String) As Integer WordCount = UBound(Split(Trim(Tekst), " ")) + 1 End Function
Herefter kan man så bruge denne funktion i forespørgslen:
SELECT COUNT(*) AS PersonerMedMellemnavne FROM dinTabel WHERE WordCount(EmployeeName) > 2
Det returnerer antallet af rækker, hvor feltet EmployeeName indeholder flere end 2 tekststrenge adskilt af mindst én blank. Med de viste eksempler burde det returnere det ønskede resultat...
Hmm.. Det viser sig, at hvis EmployeeName er tomt (Null), giver det en fejl i funktionen som beskrevet ovenfor. Derfor skal den rettes til:
Public Function WordCount(Tekst As Variant) As Integer If IsNull(Tekst) Then WordCount = 0 Else WordCount = UBound(Split(Trim(Tekst), " ")) + 1 End If End Function
Du bad om en løsning med et LIKE statement, og det fik du. Så at pointene går til on er som det skal være. :-) Vær bare opmærksom på, at hvis du ved en fejl skulle komme til at indtaste et mellemrum for meget mellem navnene, vil dette blive opfattet som et mellemnavn. Så det kræver lidt datadisciplin!
Jeg troede egentligt, at min kode tog højde for det, men Split funktionen laver samme nummer, så koden bør se sådan ud:
Public Function WordCount(Tekst As Variant) As Integer Dim Arr() As String Dim x As Integer If IsNull(Tekst) Then WordCount = 0 Else Arr = Split(Trim(Tekst), " ") For x = 0 To UBound(Arr) If Arr(x) <> "" Then WordCount = WordCount + 1 End If Next End If End Function
Nu returnerer den antallet af ord (navne), uanset hvor mange mellemrum der skulle være mellem dem.
Synes godt om
Ny brugerNybegynder
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.