Avatar billede cypherdenmark Nybegynder
24. maj 2005 - 11:37 Der er 14 kommentarer og
1 løsning

Opdelt adresse felt til adresse og husnummer

Hej Alle,

I min db har jeg et felt kaldet adresse. Det kunne jeg godt tænke mig få splittet op såldes at jeg istedet for feltet adresse har 2 felter kaldet adresse og husnummer.

F.eks i adresse feltet har jeg nu:

Adresse
DenSSjove Adresse 49

Den skal splittes til

Adresse
DenSSjove Adresse

Husnummer
49

Så det er noget med at læse bagfra og indtil man møder et blank tegn. Den tekst man så får ud skal man vel prøve at konvetere til en int (Convert.ToInt32) og så behandle fejlen hvis den ikke kan konveteres.?

Kan det lade sig gøre i SQL, hvis ja hvordan - eller skal man kode sig ud af det (jeg programmer i c#) ?

På forhånd tak.
Avatar billede arne_v Ekspert
24. maj 2005 - 12:05 #1
prøv:

UPDATE tabel
SET husnummer = RIGHT(adresse,LOCATE(' ',REVERSE(adresse)));

UPDATE tabel
SET adresse = LEFT(adresse,LENGTH(adresse)-LOCATE(' ',REVERSE(adresse)));

test lige inden du laver den på den rigtige database

du kan læse mere om string funktioner her
  http://dev.mysql.com/doc/mysql/en/string-functions.html
Avatar billede cypherdenmark Nybegynder
24. maj 2005 - 12:32 #2
hmm jeg får denne fejl

Server: Msg 195, Level 15, State 10, Line 2
'LOCATE' is not a recognized function name.
Server: Msg 195, Level 15, State 1, Line 5
'LENGTH' is not a recognized function name.
Avatar billede cypherdenmark Nybegynder
24. maj 2005 - 12:34 #3
MySql? jeg arbejeder i SQL Server !
Avatar billede arne_v Ekspert
24. maj 2005 - 12:39 #4
oops - sorry

UPDATE tabel
SET husnummer = RIGHT(adresse,CHARINDEX(' ',REVERSE(adresse)))
GO

UPDATE tabel
SET adresse = LEFT(adresse,LEN(adresse)-CHARINDEX(' ',REVERSE(adresse)))
GO
Avatar billede cypherdenmark Nybegynder
24. maj 2005 - 12:58 #5
Den tager godt nok den bagerste og sætter ind i husnummerfeltet, men problemet den tager det hele dvs.

Adresse

Vejen 23df

som kommer til at se sådan ud


Adresse
Vejen

Husnummer
23df

den burde ikke smide 23df over da det ikke er en integer
Avatar billede arne_v Ekspert
24. maj 2005 - 13:17 #6
hvis der skal checkes for valid integer, så skal du nok droppe SQL

2 gange SqlConnection
en SqlCommand med en SELECT på den ene connection
en SqlDatareader
en while løkke som henter alle data
  laver en Split på det felt
  tester om det sidste er et tal
  laver en eller 2 UPDATE på den anden connection
Avatar billede cypherdenmark Nybegynder
24. maj 2005 - 13:34 #7
hehe ja tænke det nok , er du noget du vil give et eksempel på i c#?
Avatar billede arne_v Ekspert
24. maj 2005 - 13:45 #8
det kan jeg godt - men det kan først blive i aften - er på arbejde nu

det er dog lige ud af landevejen hvis man husker at have 2 connections
Avatar billede cypherdenmark Nybegynder
24. maj 2005 - 13:52 #9
Ok det ser jeg frem til....... :-)
Avatar billede arne_v Ekspert
24. maj 2005 - 20:16 #10
et eksempel:

using System;
using System.Data;
using System.Data.SqlClient;

class MainClass
{
    public static bool IsInteger(string s)
    {
        try
        {
            int tmp = int.Parse(s);
            return true;
        }
        catch(FormatException)
        {
            return false;
        }
    }
    public static void Main(string[] args)
    {
        SqlConnection con1 = new SqlConnection("server=ARNEPC3;Integrated Security=SSPI;database=Test");
        con1.Open();
        SqlConnection con2 = new SqlConnection("server=ARNEPC3;Integrated Security=SSPI;database=Test");
        con2.Open();
        SqlCommand cre = new SqlCommand("CREATE TABLE MyTable (Id INTEGER, Adresse VARCHAR(25))", con1);
        cre.ExecuteNonQuery();
        SqlCommand ins1 = new SqlCommand("INSERT INTO MyTable VALUES(1, 'a vej 11')", con1);
        ins1.ExecuteNonQuery();
        SqlCommand ins2 = new SqlCommand("INSERT INTO MyTable VALUES(2, 'b vej 22')", con1);
        ins2.ExecuteNonQuery();
        SqlCommand ins3 = new SqlCommand("INSERT INTO MyTable VALUES(3, 'c vej 33')", con1);
        ins3.ExecuteNonQuery();
        SqlCommand ins4 = new SqlCommand("INSERT INTO MyTable VALUES(4, 'noget anderledes')", con1);
        ins4.ExecuteNonQuery();
        SqlCommand alt = new SqlCommand("ALTER TABLE MyTable ADD Nummer INTEGER", con1);
        alt.ExecuteNonQuery();
        SqlCommand sel1 = new SqlCommand("SELECT * FROM MyTable", con1);
        SqlDataReader rdr1 = sel1.ExecuteReader();
        while(rdr1.Read()) {
            int id = (int)rdr1[0];
            string gladresse = (string)rdr1[1];
            int ix = gladresse.LastIndexOf(' ');
            string lastpart = gladresse.Substring(ix+1);
            if(IsInteger(lastpart))
            {
                string nyadresse = gladresse.Substring(0, ix);
                int nummer = int.Parse(lastpart);
                SqlCommand upd = new SqlCommand("UPDATE MyTable SET Adresse = '" + nyadresse + "', nummer = " + nummer + " WHERE id = " + id, con2);
                upd.ExecuteNonQuery();
            }
        }
        rdr1.Close();
        SqlCommand sel2 = new SqlCommand("SELECT * FROM MyTable", con1);
        SqlDataReader rdr2 = sel2.ExecuteReader();
        while(rdr2.Read()) {
            Console.WriteLine(rdr2[0] + "," + rdr2[1] + "," + rdr2[2]);
        }
        rdr2.Close();
        SqlCommand drp = new SqlCommand("DROP TABLE MyTable", con1);
        drp.ExecuteNonQuery();
        con1.Close();
        con2.Close();
    }
}
Avatar billede cypherdenmark Nybegynder
24. maj 2005 - 22:42 #11
Hej tusind tak for dit svar. Jeg når først at kigge på det i morgen, er kommet lidt sent hjem... :-(

Hej så længe
Avatar billede cypherdenmark Nybegynder
25. maj 2005 - 11:15 #12
Ja det ser ud som om det virker....

Men hvis nu feltet adresse er tom så fejler den....altså enten "" eller null.....hvordan tager jeg lige højde for det
Avatar billede arne_v Ekspert
25. maj 2005 - 11:57 #13
while(rdr1.Read()) {
            int id = (int)rdr1[0];
            if(!rdr.IsDBNull(1))
            {
                string gladresse = (string)rdr1[1];
                if(gladresse != "")
                {
                    int ix = gladresse.LastIndexOf(' ');
                    if(ix >= 0)
                    {
                          string lastpart = gladresse.Substring(ix+1);
                          if(IsInteger(lastpart))
                          {
                                string nyadresse = gladresse.Substring(0, ix);
                                int nummer = int.Parse(lastpart);
                                SqlCommand upd = new SqlCommand("UPDATE MyTable SET Adresse = '" + nyadresse + "', nummer = " + nummer + " WHERE id = " + id, con2);
                                upd.ExecuteNonQuery();
                            }
                      }
                }
          }
        }

tæl lige selv slut parenteser
Avatar billede cypherdenmark Nybegynder
25. maj 2005 - 18:44 #14
Perfekt. Tak for det....

Husk et svar :-)
Avatar billede arne_v Ekspert
25. maj 2005 - 18:46 #15
kommer her
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