Mam problem z sortowaniem adresów w Firebird.
Mam adres oddzielnie w poszczególnych polach: AMiasto, AUlica, ANrDomu, ANrLokalu
Z miastem i ulicą nie ma problemu: ORDER BY UPPER(AMiasto), UPPER(AUlica),
Problem jest z numerami domów i lokali. Samo ORDER BY nie zadziała bo aby umożliwić wpisanie numeru np 1A są to pola VARCHAR. Sortuje kolejno po znakach tak że np 11 jest przed 4.
W Oraclu rozwiązałem to tak:
TO_NUMBER(REGEXP_SUBSTR(ANrDomu, ''^[0-9]+'')), REGEXP_SUBSTR(ANrDomu, ''\D+''), TO_NUMBER(REGEXP_SUBSTR(ANrLokalu, ''^[0-9]+''))
Niestety Firebird jest uboższy od Oracla i nie ma REGEXP_SUBSTR czym można by to zastąpić w moim przypadku?
Bo TO_NUMBER myślę zastąpić przez CAST(...... as integer)
Muszę jednak najpierw wywalić litery a później cyfry z pola ANrDomu i nie wiem jak to zrobić.
Czy ktoś może coś mi pomóc?
Może trzeba dodać do tabeli pole ANrDomuInt
. Wtedy na każdej bazie będzie łatwo.
jarekczek napisał(a):
Może trzeba dodać do tabeli pole
ANrDomuInt
. Wtedy na każdej bazie będzie łatwo.
To by było zbyt łatwo. Nie mogę tak zrobić. Użytkownik musi mieć możliwość wpisania np 1A. Jeśli bym zostawił stare pole to i tak bym musiał kopiować do nowego pola część liczbową.I miałbym problem co zrobić z wcześniej wpisanymi numerami musiał bym jakoś uzupełnić nowe pole - aplikacja na bazie już pracuje.
A tak nie wystarczy:
ORDER BY
LPAD(ANrLokalu,10,'0')
Panczo napisał(a):
A tak nie wystarczy:
ORDER BY LPAD(ANrLokalu,10,'0')
LPAD załatwi sprawę w większości przypadków. Będzie dobrze jeśli wszystkie numeru będą się składały tylko z cyfr. Wtedy faktycznie 4 będzie przed 11. Ok. jednak jak nam się pojawi 4A to będzie:
4
11
4A
a chciałbym:
4
4A
11
dlatego pytam jak wywalić wszystkie litery z numeru aby zostawić tylko cyfry. Posortować po cyfrach. W następnej kolejności wywalić cyfry i posortować po literach.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.