Toon posts:

[SQL]alleen cijfers selecteren uit een string

Pagina: 1
Acties:
  • 3.666 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Helaas heb ik niets kunnen vinden, vandaar maar even hier mijn vraagje.

Ik heb een stringveld in een Access database met straat+huisnummer+eventueel een achtervoegsel.
Nou wil ik uit deze string alleen de cijfers selecteren, maar ik weet de functie niet om dit te doen

Voorbeeld:
'Kerkstraat 13 huis' moet worden 13.

Dit moet ik dus met SQL oplossen, iemand de oplossing?

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 25-01 15:24
Als je deze query wilt uitvoeren op de data zoals je die nu hebt opgeslagen, heb je je database verkeerd opgezet. Splits het huidige adresveld in drie aparte velden, 1 voor straatnaam, 1 voor huisnummer en 1 voor achtervoegsel.

  • scatman
  • Registratie: Januari 2004
  • Laatst online: 19:17
denk dat je makkelijkst met ltrim en rtim functie werkt, moet je maar is op googlen, vind je veel over
of anders met de instr en substr functie
select instr(addres,' ',0,1) into spatie1 from dual;
select instr(addres,' ',0,2) into spatie2 from dual;
select substr(addres,spatie1,length(addres)-spatie2)) from dual;

denk zoiets, kan het wel niet uittesten, maar iets in die aard moet het volgens mij wel zijn

Verwijderd

Topicstarter
rrrandy schreef op vrijdag 15 juli 2005 @ 11:46:
Als je deze query wilt uitvoeren op de data zoals je die nu hebt opgeslagen, heb je je database verkeerd opgezet. Splits het huidige adresveld in drie aparte velden, 1 voor straatnaam, 1 voor huisnummer en 1 voor achtervoegsel.
Dat de database verkeerd is opgezet, lijkt me duidelijk. Echter, dit is niet mijn database, ik moet er alleen mee werken.

@Scatman, ik ga ff googlen op trim, maar ik betwijfel of dit de oplossing is, daar ik de aantallen chars links en rechts niet weet.

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Verwijderd schreef op vrijdag 15 juli 2005 @ 11:51:
[...]


Dat de database verkeerd is opgezet, lijkt me duidelijk. Echter, dit is niet mijn database, ik moet er alleen mee werken.

@Scatman, ik ga ff googlen op trim, maar ik betwijfel of dit de oplossing is, daar ik de aantallen chars links en rechts niet weet.
Ik zou een functie schrijven die per character de ASCII code checkt of op isInt(). Zo kan je makkelijk bepalen of het een nummer is.

Je moet alleen zelf bepalen wat je doet met:
Kerstraat 13b 2 hoog

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • Sikkek
  • Registratie: Maart 2004
  • Laatst online: 04-05 17:42
Of met Plein 1940-1945 10

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

offtopic:
Het was maar een voorbeeld, denk dat TS niet zit te wachten op allerlei mogelijke straatnamen waar het fout kan gaan ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

Topicstarter
Ok, het gaat niet om de uitzonderingen in dit geval. Die had ik inderdaad ook bedacht, echter kan ik wel een kleine foutmarge incalculeren.

Focus svp alleen op 'Kerstraat 13 huis'

Die trim wordt het trouwens niet, ik kijk nog even naar isInt()

[ Voor 19% gewijzigd door Verwijderd op 15-07-2005 12:06 ]


Verwijderd

Ik weet niet of het in access werkt (in Oracle in elk geval wel):
ltrim(rtrim(translate(lower('Kerkstraat 13 huis'),'abcdefghijklmnopqrstuvwxyz',' ')))

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 20:33

mulder

ik spuug op het trottoir

Ik weet niet of je in Access net als in SQL Server een Split function kan implementeren, anders zou ik dat eens proberen. In combinatie met een IsNumeric kun je dan bepalen of het een nummer is (brilliant :/)

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Helaas kan ik nu even niet verder met deze kwestie: iets anders is prio 1 geworden.
Ik kom hier later nog op terug en mocht ik de juiste functie hebben gevonden, laat ik het weten.

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
In Sqlserver kan je in ieder geval een user defined function maken, wat je kan doen is in die functie loopen over elk character en dan alleen de cijfers retourneren.

  • scatman
  • Registratie: Januari 2004
  • Laatst online: 19:17
@Scatman, ik ga ff googlen op trim, maar ik betwijfel of dit de oplossing is, daar ik de aantallen chars links en rechts niet weet.
ltrim & rtrim werkt niet met aantal chars, maar met welke char je opgeeft
dus iets in de aard van:
select ltrim('dit is een test',' ') from dual;
geeft volgens mij: 'is een test'

  • Pepper
  • Registratie: Februari 2002
  • Laatst online: 19-06-2025

Pepper

The one and only!!

Ik weet niet of dit ook in Access werkt maar je zou het kunnen proberen.
Zo is het iig in MS SQL:
SQL:
1
2
SELECT Substring (adresKolom , CHARINDEX (' ',adresKolom)+1 , 800)
FROM tabelNaam

Maar is alleen mogelijk als er altijd een spatie tussen adres een huisnummer staat.

[ Voor 4% gewijzigd door Pepper op 15-07-2005 14:55 ]

dus...


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
scatman schreef op vrijdag 15 juli 2005 @ 13:21:
[...]


ltrim & rtrim werkt niet met aantal chars, maar met welke char je opgeeft
dus iets in de aard van:
select ltrim('dit is een test',' ') from dual;
geeft volgens mij: 'is een test'
LTrim trimmed gewoon spaties van de linker kant af. (En RTrim dus van de Rechter kant)
SQL Server Books Online:
LTRIM
Returns a character expression after removing leading blanks.

Syntax
LTRIM ( character_expression )

Arguments
character_expression
Is an expression of character or binary data. character_expression can be a constant, variable, or column. character_expression must be of a data type that is implicitly convertible to varchar. Otherwise, use CAST to explicitly convert character_expression.
MS Access Documentatie:
LTRIM( ) Hiermee worden spaties verwijderd die aan een tekenreeks voorafgaan.
LTrim kent dus niet eens een 2e parameter.

[ Voor 25% gewijzigd door RobIII op 15-07-2005 14:54 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dit is best lastig, in uberhaupt welke programmeertaal dan ook, uit te voeren. Maar de meeste kans heb je met een regexp die je een getal laat opzoeken.
SQL kent echter zeer weinig serieuze stringfuncties die in deze context bruikbaar zijn. Vaak is er wel een of andere regexp mogelijk, maar dan weer niet met replacements. Substring en charindex/locate functies zijn onhandig etc.

Ik zou dit in ieder geval niet graag oplossen in SQL. De oplossing met trim vind ik wel aardig trouwens, omdat je daarmee domweg weg laat slopen wat niet geldig is, totdat er een getal over blijft; ongeveer het omgekeerde als een 's/([0-9]+)/\1/' perlregexp zou doen. Hij zou trouwens evt nog wat eenvoudiger kunnen met zoiets:
TRIM(BOTH 'abcd.....xyz ' FROM adresKolom)

Maar access moet dat wel ondersteunen natuurlijk.

RobIII: En de Trim-functie zelf?

[ Voor 3% gewijzigd door ACM op 15-07-2005 14:59 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ACM schreef op vrijdag 15 juli 2005 @ 14:59:

RobIII: En de Trim-functie zelf?
Transact SQL kent geen Trim, alleen LTrim en RTrim (en dat is trouwens klote, want als je alle spaties links én rechts weg wil hebben moet je dus LTrim(RTrim(bla)) doen) en bij Access is dat gewoon een functie die zowel links als rechts dus trimmed volgens mij...
raptorix schreef op vrijdag 15 juli 2005 @ 15:05:
http://www.sqlteam.com/item.asp?ItemID=13947

Hierin staat een voorbeeld hoe je via een user defined function kan zoeken op een reguliere expressie, met enige tweaks kan je denk ik wel bereiken wat je wilt.
En dat is weer MSSQL, maar de TS heeft het hier over MS Access mensen...

[ Voor 44% gewijzigd door RobIII op 15-07-2005 15:09 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
http://www.sqlteam.com/item.asp?ItemID=13947

Hierin staat een voorbeeld hoe je via een user defined function kan zoeken op een reguliere expressie, met enige tweaks kan je denk ik wel bereiken wat je wilt.

  • scatman
  • Registratie: Januari 2004
  • Laatst online: 19:17
LTrim kent dus niet eens een 2e parameter.
bij oracle wel hoor...

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
...en waar zie jij oracle staan in dit topic?
Misschien kent Trim nog wel 84 andere parameters in een compleet ander DBMS, maar daar is de TS niet mee geholpen...

[ Voor 20% gewijzigd door RobIII op 15-07-2005 16:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Dank voor alle reacties. Na mijn vakantie ga ik de ltrim/rtrim functies zeker uitproberen!

Maar, zoals gemeld: eerst vakantie :)
Ik kom hier zeker op terug!

  • Mick
  • Registratie: Januari 2003
  • Laatst online: 17-04-2022

Mick

iedereen is uniek behalve ik

Dit lijkt me (na je vakantie evt. :)) iets voor Perl (PHP), als je ook de lastige gevallen wilt kunnen pakken. Dan is de taak het splitten in Straat, Huisnummer, Toevoeging. (Zoals ACM al zei, reguliere expressie.) Zoals de genoemde "Kerkstraat 13b 2 hoog" of "Plein 1940-1945 10".
Of je eigen "Kerkstraat 13 huis" of "1e Helmerstraat 12 2hoog". Hier werd er ook al over gesproken.

Je zou een expressie voor huisnummer en toevoeging kunnen definiëren. Dan is het stukje ervoor de straat, en het stukje zelf splits je op de spatie. Is die er niet dan is er geen toevoeging.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$adres = "1e Helmerstraat 12a 2hoog"; # of bv. $adres = "Plein 1940-1945 10";

# nummer+toevoeging: spatie, dan getal en eventueel een teken, dan eventueel 
# nog een spatie met een teken - dit alles aan het eind van de string
$expr = '\s\d+\w*\s*\w+$';

($straat,$temp) = split(/$expr/,$adres);
($temp,$rest) = split(/$straat/,$adres);
$rest =~ s/ //; # spatie aan begin weghalen
($nummer,$toevoeging) = split(/ /,$rest);

print "straat = $straat\n";
print "nummer = $nummer\n";
print "toevoeging = $toevoeging\n";


't Is misschien meer dan dat huisnummer 13 wat je wilde, maar zo kun je de databaserecords netjes splitten als je wilt. Maar het schijnt altijd op talloze manieren te kunnen, je zou ook de reguliere expressie voor het huisnummer kunnen maken; en straat ervoor en toevoeging erna pakken. (Er zullen vast wel weer addressen bestaan waarop het niet werkt.) :)

[ Voor 5% gewijzigd door Mick op 16-07-2005 01:00 ]

computo ergo sum


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Roboticles schreef op zaterdag 16 juli 2005 @ 00:57:
Dit lijkt me (na je vakantie evt. :)) iets voor Perl (PHP),
Niet om te zeiken ofzo, maar waarom wordt er altijd meteen PHP/Perl geroepen? Waarom zou dit niet kunnen in ASP Classic, ASP.NET, VB.NET, VB6, C++, C#, Java of voor mijn part J# of willekeurig welke andere taal? Ik vind dat zo'n nonsense. Overal wordt PHP bijgehaald... Bij mijn weten kennen al deze talen reguliere expressies, en als ze dat niet kunnen (zoals native VB6) dan haal je er een com-objectje bij of een willekeurig library die die functionaliteit biedt. PHP/Perl is écht niet de enige manier om Regex-en te gebruiken...
Verwijderd schreef op vrijdag 15 juli 2005 @ 19:26:
Dank voor alle reacties. Na mijn vakantie ga ik de ltrim/rtrim functies zeker uitproberen!

Maar, zoals gemeld: eerst vakantie :)
Ik kom hier zeker op terug!
Heb je onze replies wel gelezen? Met (L/R) Trim ga je er niet komen..

[ Voor 48% gewijzigd door RobIII op 16-07-2005 02:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

RobIII schreef op zaterdag 16 juli 2005 @ 01:50:
PHP/Perl is écht niet de enige manier om Regex-en te gebruiken...
En juist omdat dat niet de enige manier ervoor is, boeit het niet in welke taal het voorbeeld staat. Voordeel van Perl hierin is dat het zoveel minder statements zijn om uberhaupt te kunnen regexpen en er dus beter de nadruk op de regexps gelegd kan worden ;)
Roboticles schreef op zaterdag 16 juli 2005 @ 00:57:
code:
1
($temp,$rest) = split(/$straat/,$adres);
Dat is neem ik aan een foutje en moet ook $expr zijn?

  • Mick
  • Registratie: Januari 2003
  • Laatst online: 17-04-2022

Mick

iedereen is uniek behalve ik

ACM schreef op zaterdag 16 juli 2005 @ 11:54:
[...]
Dat is neem ik aan een foutje en moet ook $expr zijn?
Nee Afbeeldingslocatie: http://images.fok.nl/s/emo.gif eerder een minder nette oplossing geïnspireerd door de wens om zo'n incidenteel geval als "Plein 1940-1945 10b 3hoog" ook aan te kunnen. Anders was het eleganter geweest.

computo ergo sum

Pagina: 1