2010-07-29 3 views
0

Je suis à la recherche d'un meilleur moyen de rechercher à travers les plages numériques dans Oracle Text. J'ai une application de base de données qui fait beaucoup de choses de type SIG, mais nous voulons maintenant ajouter la recherche de gamme de rue à elle. Donc, je voudrais stocker les valeurs min et max dans une colonne, et chercher un nombre dans ces valeurs. Je suis heureux d'aller explorer les options, mais j'aimerais avoir quelques indications sur la direction à prendre. Est-ce que quelqu'un a des suggestions pour moi?Recherche de texte Oracle pour les plages

EDIT: nous essayons simplement de faciliter les recherches d'adresse. Le texte sur les pièces d'adresse a été un énorme succès, mais nous voulons stocker des rangées de rue au lieu de chaque numéro de maison individuel. Donc, si je cherchais "11 high street", je m'attendrais à un match si high street avait une gamme de 1 à 1000. J'aimerais aussi quelques options que je peux utiliser si je cherchais "flat 1 11 high" rue "aussi bien. Je pense que je devrais faire quelques jiggery avec l'entrée dans ces cas, je veux juste savoir quel genre d'outils il y a que je pourrais essayer de travailler avec.

+0

Pouvez-vous donner plus de détails sur la configuration. Quel est le format de votre adresse et y attachez-vous des coordonnées spatiales? Ma première impression est que, plutôt que des numéros de rues, vous aurez besoin d'une géométrie en forme de boîte ou de ligne pour voir s'il y a une intersection. –

Répondre

2

Ma suggestion est de faire champ de chaîne de longueur standard pour stocker les numéros de construction, de créer un index sur ce champ, puis utiliser between pour la recherche.

Quelque chose comme ce format:

NNNNNNCCCCBBBB 

où:

NNNNNN - numéro de maison rembourré gauche;
CCCC - caractère matelassé à gauche (comme 'A' dans '11A');
BBBB - Sous la rubrique « gauche rembourré » gauche rembourré numéro de bâtiment

Je veux dire « avec un symbole rempli de longueur standard à gauche », voir par exemple résultat de requête select lpad('11',5,'X') from dual;.

E.g. supposons que vous avez l'adresse "11A high street building 5" et choisissez "%" comme symbole de remplissage. Lorsqu'il est converti au format proposé, il ressemble à '%%%11%%%A%%%' et 'high street' est stocké dans un ou plusieurs champs séparés. suivant est par exemple de requête pour sélectionner toutes les maisons entre 1 et 1000:

with address_list as (
    select '%%%11%%%A%%%%' bnum from dual union all 
    select '%1001%%%A%%%%' bnum from dual union all 
    select '%%%%1%%%A%%%%' bnum from dual union all 
    select '%%%%1%%%%%%%%' bnum from dual union all 
    select '%%321%%%A%%%%' bnum from dual union all 
    select '%1000%%%A%%%%' bnum from dual union all 
    select '%1000%%QQ%%12' bnum from dual 
) 
select * from address_list 
where 
    -- from '1 high street' 
    bnum >= '%%%%1%%%%%%%%' 
    and      
    -- less then '1001 high street'    
    bnum < '%1001%%%%%%%%' 
order by 
    bnum 

En cas réel est préférable d'utiliser chr(1) ou tout autre symbole comme symbole pour unprintable rembourrage.

Une autre chose est de construire uniquement un index basé sur les fonctions pour la recherche sans stockage réel sur le terrain.

2

ya un problème avec

WHERE <number> BETWEEN minColumn AND maxColumn 
+0

Souvent, les numéros de rue ne sont pas (chiffres qui sont). Je vis au numéro 11, et la maison à côté de moi est 11A. –

+0

11A est un nombre .. 11A est juste hex pour 282 bro – nothingisnecessary

Questions connexes