Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Select su campo cercando caratteri non alfabetici

    Ciao ragazzi,
    ho bisogno di una mano per una query che non so come scrivere.
    In pratica devo eseguire una select che mi vada a recuperare le righe nelle quali il campo "nome" inizi con caratteri non compresi nell'alfabeto, quindi per esempio avendo queste righe

    1 mario
    2 <giuseppe@pippo.it>
    3 (no name)
    4 Luca
    5 347/55667788

    mi deve recuperare la riga 2, la riga 3 e la riga 5.
    E' ovvio che se il nome è stato scritto come <giuseppe@pippo.it> o come (no name) c'è un motivo ben preciso, quindi non suggeritemi di normalizzare il campo, nè di aggiungere un ulteriore campo a mo' di flag che indichi che...

    Grazie a tutti, ciao

  2. #2
    ps: ovviamente per "alfabeto" intendo lettere dalla "a" alla "z", nello specifico case insensitive.

    Grazie

  3. #3
    In SQL esiste la funzione ASCII che ti restiuisce il codice ASCII di un char che gli passi in input.
    Le lettere minuscole dell'alfabeto sono comprese tra il codice ASCII 97 e il codice ASCII 122
    Quindi puoi fare

    SELECT... FROM... WHERE ASCII(SUBSTRING(LOWER(nome),1,1)) < 97 OR ASCII(SUBSTRING(LOWER(nome),1,1)) > 122

  4. #4
    Ah ecco, questa è nuova ma utile!
    Ultima info, più che altro per questioni di performance. Il numero totale di elementi che rientrano in questa categoria è relativamente basso (intorno al 30% del totale), quindi secondo te conviene cercare quelli fuori dall'intervallo o escludere quelli compresi? A logica dovrebbe essere quelli esclusi, ma la query è una OR, mentre escludendo quelli compresi si usa una AND, ma su un numero maggiore di record....

    Grazie per il prezioso aiuto comunque!
    Ciao

  5. #5
    Non ti conviene usare l'esclusione perché è come fare 2 query
    L'esclusione infatti funziona così:

    where <nome_campo> NOT IN (SELECT... FROM... WHERE...)

    quindi tu dovresti fare where... NOT IN (SELECT... WHERE... < 97) AND ... NOT IN (SELECT... WHERE ... >122)

  6. #6
    Sì ok, intendevo se fare
    WHERE NOT (ASCII(SUBSTRING(LOWER(nome),1,1)) >= 97 and ASCII(SUBSTRING(LOWER(nome),1,1)) <= 122)
    (se poi funziona non ne ho idea, mi sa di no, ma era giusto per chiarire la domanda che ho fatto )

  7. #7
    ah ok! sinceramente mi ero dimenticato dell'operatore NOT in SQL!!!!!

    Comunque credo che, in termini di performance, prevalga sempre quella che ti ho detto io...

    Che poi... ha senso parlare di performance se hai una tabella con centinaia di migliaia di righe.. o se devi effetture quella query un sacco di volte in un determinato tempo...

    Oppure se sei uno studente che deve affrontare l'esame di basi di dati!!!!

  8. #8
    Originariamente inviato da nicolabiondo
    ha senso parlare di performance se hai una tabella con centinaia di migliaia di righe.. e se devi effetture quella query un sacco di volte in un determinato tempo...
    Entrambe...centinaia di migliaia di record e potenzialmente decine di query al secondo.

    (Sì, lo so, sarebbe stato molto più semplice un flag impostato in fase di update/insert a indicare se è alfabetico o meno...ma la progettazione del sistema non l'ho fatta io e per ora dobbiamo tenercela così :s )

  9. #9
    Bom,
    fuziona a dovere ed è anche abbastanza rapida ... non rapidissima ma accettabile:
    Con server appena avviato (quindi cache mysql pulite)

    codice:
    Stato 	Tempo
    starting 	0.000085
    Waiting for query cache lock 	0.000007
    checking query cache for query 	0.000204
    checking permissions 	0.000015
    Opening tables 	0.001530
    System lock 	0.000040
    Waiting for query cache lock 	0.000063
    init 	0.000098
    optimizing 	0.000034
    statistics 	0.167955
    preparing 	0.000085
    executing 	0.000006
    Sorting result 	0.053173
    Sending data 	0.000635
    Waiting for query cache lock 	0.000007
    Sending data 	0.001598
    Waiting for query cache lock 	0.000014
    Sending data 	0.001116
    end 	0.000014
    query end 	0.000005
    closing tables 	0.000015
    freeing items 	0.000040
    Waiting for query cache lock 	0.000004
    freeing items 	0.000232
    Waiting for query cache lock 	0.000010
    freeing items 	0.000003
    storing result in query cache 	0.000006
    logging slow query 	0.000003
    cleaning up 	0.000006
    Dopo un po' di lavori (quindi con cache valorizzate)
    codice:
    Stato 	Tempo
    starting 	0.000027
    Waiting for query cache lock 	0.000006
    checking query cache for query 	0.000019
    checking privileges on cached 	0.000004
    checking permissions 	0.000008
    sending cached result to clien 	0.002106
    logging slow query 	0.000011
    cleaning up 	0.000004
    Accettabile, direi. Per riferimento, server con processore Genuine Intel(R) 2140 @ 1.60GHz (dual core, bogomips 3199.94), ram 1 Gb, record totali nella tabella 70200, mysql con cache query, cache chiavi, due tread, disci scarsini a 5.400 giri.
    Il server di produzione è invece un 8 core Xeon W3520 @ 2.67Gz, ram 36Gb e compagnia bella e da questi risultati:
    codice:
    Stato 	Tempo
    starting 	0.000010
    checking query cache for query 	0.000068
    Opening tables 	0.000007
    System lock 	0.000003
    Table lock 	0.000017
    init 	0.000025
    optimizing 	0.000013
    statistics 	0.000007
    preparing 	0.000011
    executing 	0.000001
    Sorting result 	0.036400
    Sending data 	0.000799
    end 	0.000004
    query end 	0.000002
    freeing items 	0.000017
    storing result in query cache 	0.000007
    logging slow query 	0.000001
    cleaning up 	0.000004
    e dopo lavori vari
    codice:
    Stato 	Tempo
    starting 	0.000010
    checking query cache for query 	0.000007
    checking privileges on cached 	0.000004
    sending cached result to clien 	0.000022
    logging slow query 	0.000003
    cleaning up 	0.000002
    Grazie mille per l'aiuto, a buon rendere

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.