[Lugge] Re: formattazione tabella SQL

  • From: "Zingus J. Rinkle" <1999s039@xxxxxxxxxxxxxxxxxx>
  • To: lugge@xxxxxxxxxxxxx
  • Date: Thu, 7 Nov 2002 02:48:04 +0100

Non soddisfatto di non farsi capire a parole, Arnaudo Massimo decise di
superarsi e di non farsi capire neanche per iscritto:
> * Zingus J. Rinkle <1999s039@xxxxxxxxxxxxxxxxxx> [martedì 05 novembre 2002, 
> alle 07:15]:
> > 
> > s/int(5)/int[5]/
> > s/int(12)/int[12]/
> > 
> Ma come ci sei arrivato?
Divinazione, mancanza di background MySQL ed una estensiva
lettura del manuale...
 
> > ...
> > cap                 char(5)     check (cap ~ '^[0-9]*$'),
> > ...
> > telefono_casa       varchar(12) check (telefono_casa ~ '^[0-9]*$'),
> > ...
> Ora funziona.
Ma come disse una volta un tale: "Si puo` fare di meglio".
Fatto. E` in allegato.

La tavola controlla la correttezza del cap, dei n.ri di tel.,
dell'e_mail e del sito_web. Od almeno ci prova. Le regex che
ho scritto vanno ancora rodate...
(la re per il sito_web e` basata su quella che usa urlview,
ma l'ho dovuta modificare...)

Si possono scrivere altre funzioni:
-) una per controllare i codici fiscali, se qualcuno sa come
controllarne la coerenza,
(mi han detto che le ultime cifre sono un digest del resto,
ma non ne sono sicuro...)
-) una per controllare che il comune sia in una lista di comuni
noti in una tabella, ma credo esuli gli obbiettivi ;-),
-) una per fare la stessa cosa con le province... (piu` fattibile)

Ah, nel mio file ho tolto le lunghezze ad alcuni campi
varchar che IMHO non hanno un formato fisso. Anche ad altri
andranno tolte...  E` insensato porre dei limiti a certi
campi, e.g. il nome; Soprattutto dato che anche cosi` pg
non consuma memoria aggiuntiva...

> Grazie.
Grazie a te per avermi dato l'occasione di misurarmi con la
pingue bestiaccia diamantina. :-)

In procinto di addormentarmi,
Zingus
--
  _________  +-------------------------------------------------------+
\/   _____/ /  http://as0.da.ru                       icq: 164939262 |
ZJR _____/ |  mailto:zingus_at_fuckmicrosoft.com                     |
/\______/  +-------------------------------------- Zingus J. Rinkle -+
-- Dropping --
drop table soci;

-- Functions --
create or replace function is_num (varchar) returns boolean as '
        select $1 ~ ''^[0-9]*$''
' language SQL;

create or replace function is_tel (varchar) returns boolean as '
        select $1 ~ ''^[+]?[0-9]*$''
' language SQL;

create or replace function is_email (varchar) returns boolean as '
        select $1 ~ ''^[[:alnum:]\\.-_]+@[[:alnum:]\\.-_]+$''
' language SQL;

create or replace function is_url (varchar) returns boolean as '
        select $1 ~ 
''^(((https?|ftp|gopher|file)://|(mailto|news):)|(www|web|w3).[-a-z0-9.]+)[^ 
,;<>:]+$''
' language SQL;

-- Tables --
CREATE TABLE soci(
id_socio                integer not null PRIMARY KEY,
titolo                  varchar(15),
cognome                 varchar(20),
nome                    varchar(20),
nato_il                 date,
codice_fiscale          varchar(16),
professione             varchar(20),
indirizzo               varchar(30),
cap                     varchar(5)      check (is_num(cap)),
comune                  varchar(15),
sigla_comune            varchar(4),
stato                   varchar(15),
telefono_casa           varchar         check (is_tel(telefono_casa)),
telefono_ufficio        varchar         check (is_tel(telefono_ufficio)),
telefono_varie          varchar         check (is_tel(telefono_varie)),
telefax                 varchar         check (is_tel(telefax)),
portatile               varchar         check (is_tel(portatile)),
portatile_2             varchar         check (is_tel(portatile_2)),
e_mail                  varchar         check (is_email(e_mail)),
sito_web                varchar         check (is_url(sito_web))
);

/*
-- Testing --
insert into soci (id_socio,titolo,cognome,telefono_casa,e_mail,sito_web)
values 
(10,'Dr.','Jekill','+39123456','mybutt@xxxxxxxxxxxxxxxx','file://localhost/usr/local/pgsql/doc/html/plperl-install.html');

insert into soci (id_socio,titolo,cognome,telefono_casa,e_mail)
values (11,'Mr.','Hide','ab546','alpha_petrolii@xxxx');

select * from soci where cognome ~ 'Jekill|Hide';
*/

Other related posts: