+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Confronto booleano su query.

  1. #1
    lemorlenny non è in linea Novello
    Salve
    non sono esperto di MySql ed avrei bisogno di un consiglio.
    Ho un campo di tipo Varchar dove sono presenti in forma di bit true o false delle opzioni di configurazione di un programma:

    opzione1 opzione2 opzione3 opzione4 ......
    ____0________1________1________0 ......


    per cui nel campo del record mi troverò 0110......
    Ora io vorrei effettuare una query che mi riportasse tutti i record nei quale compare almeno 1 true nella posizione corrispondente, vale a dire che io passo alla query ad es."0110" e vorrei che tornassero o record con: "0100"-"0010"-"0010" ecc. ovvero tutti i record dove si presenta un valore '1' corrispondente in una qualsiasi posizione.
    Immagino che si possa fare passando un operatore booleano tramite la query ed ho Googlato un pò ma non sono riuscito a trovare la soluzione.

    Ringrazio in anticipo.

    Paolo

  2. #2
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Quote Originariamente inviato da lemorlenny Visualizza il messaggio
    Salve
    non sono esperto di MySql ed avrei bisogno di un consiglio.
    Ho un campo di tipo Varchar dove sono presenti in forma di bit true o false delle opzioni di configurazione di un programma:

    opzione1 opzione2 opzione3 opzione4 ......
    ____0________1________1________0 ......


    per cui nel campo del record mi troverò 0110......
    Ora io vorrei effettuare una query che mi riportasse tutti i record nei quale compare almeno 1 true nella posizione corrispondente, vale a dire che io passo alla query ad es."0110" e vorrei che tornassero o record con: "0100"-"0010"-"0010" ecc. ovvero tutti i record dove si presenta un valore '1' corrispondente in una qualsiasi posizione.
    Immagino che si possa fare passando un operatore booleano tramite la query ed ho Googlato un pò ma non sono riuscito a trovare la soluzione.

    Ringrazio in anticipo.

    Paolo
    Risulta difficile capire cosa vuoi ottenere ....

    Intanto risulta errato il campo del db : dovrebbe essere un campo numerico e non un campo di testo !
    La tua frase 'ovvero tutti i record dove si presenta un valore 1 corrispondente in una qualsiasi posizione' per me è incomprensibile ovvero io comprendo che ti basta testare il tuo campo (numerico) per maggiore di zero ma credo che non sia quello che intendi tu.
    Sii gentile spiega meglio cosa vuoi ottenere e specifica anche se puoi cambiare il tipo di campo del db.

  3. #3
    lemorlenny non è in linea Novello
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    Risulta difficile capire cosa vuoi ottenere ....

    Intanto risulta errato il campo del db : dovrebbe essere un campo numerico e non un campo di testo !
    La tua frase 'ovvero tutti i record dove si presenta un valore 1 corrispondente in una qualsiasi posizione' per me è incomprensibile ovvero io comprendo che ti basta testare il tuo campo (numerico) per maggiore di zero ma credo che non sia quello che intendi tu.
    Sii gentile spiega meglio cosa vuoi ottenere e specifica anche se puoi cambiare il tipo di campo del db.
    Chiedo scusa se non sono stato chiaro, provo a specificare un po meglio.
    Ho una programma dove l'utente inserisce alcune specifiche di una ricerca da effettuare, per esempio l'utente vuole estrarre tutti gli appartamenti che hanno determinate caratteristiche.
    Per evitare di creare un campo per ogni caratteristica e dato che sono tutti valori si/no avevo pensato di creare una lista di 01 (true e false,S e N) e di memorizzare questi valori che una semplice lista, appunto una stringa di 0 e 1, che corrispondesse allo stato degli elementi del mio appartamento.
    Ad esempio nel programma ho una serie di checkbox dove selezionare:
    Termosingolo: si/no
    Garage: si/no
    Terrazza: si/no
    ecc.
    A questo punto dalla lista delle checkbox mi esce un ipotetico "1001001...." che vado a cercare nel mio DB dove in precedenza ho compilato il campo delle caratteristiche dell'appartamento mettendo, ad esempio, un '1' in posizione 3 che corrisponde al Garage. Nella SELECT basta che esista un '1' in posizione 3, sempre per esempio, che estraggo il record perchè l'appartamento ha il garage.
    In questo modo evito di creare un campo per ogni caratteristica dell'appartamento.

    Spero di essere stato più chiaro e grazie per la risposta.

    Paolo

  4. #4
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Ero quasi certo che saremmo arrivati a questo punto : TI SERVE UN CAMPO DI TIPO NUMERICO.
    Dopo utilizzi l' AND tra i bit.
    Supponendo di avere un campo numerico dove memorizzi le tue opzioni (1 bit = 1 opzione) e supponendo di avere nel 3° bit l' informazione di garage (1 = Si, 0 = No) avrai un campo numerico che avrà almeno il 3° bit settato ad 1 (in presenza di garage). Questo campo numerico conterrà il valore di 4 (se esiste solo il 3° bit impostato altrimenti avrà altri valori).
    Questa è indicativamente la tua select :

    select * from tabella where (MyIntField AND 4) = 4

    La sintassi della select è da verificare ....
    Con questa tecnica (mascheratura dei bit) puoi estrarre anche più informazioni (opzioni) insieme. Supponi che ti serva estrarre le opzioni del 3° e del 5° bit. Il tuo valore di ricerca è dato dalla somma dei bit : ovvero 2^(3-1) + 2^(5-1) = 4 + 16 = 20.
    Il valore delle 2 opzioni combinate è quindi 20 -> (MyIntField AND 20) = 20

    Questo metodo funziona con i campi numerici, ho dei seri dubbi che sia applicabile ai campi alfanumerici.

  5. #5
    lemorlenny non è in linea Novello
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    Ero quasi certo che saremmo arrivati a questo punto : TI SERVE UN CAMPO DI TIPO NUMERICO.
    Dopo utilizzi l' AND tra i bit.
    Supponendo di avere un campo numerico dove memorizzi le tue opzioni (1 bit = 1 opzione) e supponendo di avere nel 3° bit l' informazione di garage (1 = Si, 0 = No) avrai un campo numerico che avrà almeno il 3° bit settato ad 1 (in presenza di garage). Questo campo numerico conterrà il valore di 4 (se esiste solo il 3° bit impostato altrimenti avrà altri valori).
    Questa è indicativamente la tua select :

    select * from tabella where (MyIntField AND 4) = 4

    La sintassi della select è da verificare ....
    Con questa tecnica (mascheratura dei bit) puoi estrarre anche più informazioni (opzioni) insieme. Supponi che ti serva estrarre le opzioni del 3° e del 5° bit. Il tuo valore di ricerca è dato dalla somma dei bit : ovvero 2^(3-1) + 2^(5-1) = 4 + 16 = 20.
    Il valore delle 2 opzioni combinate è quindi 20 -> (MyIntField AND 20) = 20

    Questo metodo funziona con i campi numerici, ho dei seri dubbi che sia applicabile ai campi alfanumerici.
    E' quello che temevo .
    Ti ringrazio per la celere risposta.

    Allora io ho la maschera delle caratteristiche in formato numerico nel DB, diciamo 2773 (101011010101) poi per la ricerca estraggo dall'elenco delle caratteristiche da cercare (checkbox) tutti i bit a 1, (es.000000101000), poi creo una query del tipo:
    select * from tabella where (MyIntField AND 4) = 4 OR  (MyIntField AND 6) = 6
    
    in modo da trovare tutte le combinazioni.
    Se invece dovessi trovare il valore 'secco' della ricerca passo direttamente:
    select * from tabella where (MyIntField AND 40) = 40  //in questo specifico esempio (4° e 6° bit)
    
    (ma si parte da 0 contando da destra no?)

    Ho provato la query in Access ma non ho capito se la può eseguire, ad esempio ho inserito i valori di 17 (10001) e di 16 (10000) ma la query:
    select * from tabella where (campo AND 0) = 0  // torna tutti i record
    select * from tabella where (campo AND 1) = 1  // torna EOF
    select * from tabella where (campo AND 4) = 4  // torna EOF
    select * from tabella where (campo AND 5) = 5  // torna EOF
    
    comunque Googgolando ho verificato che la sintassi da te proposta è corretta per cui devo verificare come access gestisce la cosa (anche se poi devo farla girare su MySql).

    Ti ringrazio moltissimo per i suggerimenti.

    Paolo

  6. #6
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Se utilizzi MySql >= 5.0.3 esiste già il tipo di dato bit che può memorizzare fino 64 bit ->bit(64) Manuale MySQL - Bit Type
    Comunque io proverei ad usare BIGINT (di fatto un campo intero da 64 bit) oppure BIT(64) e userei le funzioni specifiche dei bit :MySQL Bit-functions

    ciao

  7. #7
    L'avatar di +m+
    +m+
    +m+ non è in linea Scribacchino
    Aggiungo un dettaglio, anche se non particolarmente utile, magari in altre circostanze.
    E' possibile con mysql effettuare la prima interrogazione, quella con gli "1" nel campo testo, con un banale
    select * from test where ser like '_1___'
    
    Essenzialmente mettendo un _ al posto di un carattere (come fosse un ? per capirci).
    Funziona anche con campi numerici, senza alcuna necessità di conversione, ma implica una scansione full della tabella.

    Inoltre, sempre così a titolo didattico, qualcosa del genere
    select * from test where (ser AND 40)=40
    
    andrebbe evitato, perchè impedisce l'utilizzo di un eventuale indice.
    Se vuoi un valore "secco" è molto meglio
     select * from test where ser=40
    
    .
    Lo vedi facilmente con un explain

  8. #8
    lemorlenny non è in linea Novello
    Quote Originariamente inviato da +m+ Visualizza il messaggio
    Aggiungo un dettaglio, anche se non particolarmente utile, magari in altre circostanze.
    E' possibile con mysql effettuare la prima interrogazione, quella con gli "1" nel campo testo, con un banale
    select * from test where ser like '_1___'
    
    Essenzialmente mettendo un _ al posto di un carattere (come fosse un ? per capirci).
    Funziona anche con campi numerici, senza alcuna necessità di conversione, ma implica una scansione full della tabella.
    Interessante, potra' servire, grazie.

    Paolo

  9. #9
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    Se utilizzi MySql >= 5.0.3 esiste già il tipo di dato bit che può memorizzare fino 64 bit ->bit(64) Manuale MySQL - Bit Type
    Comunque io proverei ad usare BIGINT (di fatto un campo intero da 64 bit) oppure BIT(64) e userei le funzioni specifiche dei bit :MySQL Bit-functions

    ciao
    Non mi trovo molto in sintonia con questa soluzione, che è a mio modo di vedere troppo invasiva.
    Modificare il tipo di campo richiede anche il rivedere tutte le regole, codice, ecc. in cui è coinvolto.

    In aggiunta, se gli fai usare un campo numerico, come farà poi a codificare i bit: "0010" ?
    Non mi risulta che un campo numerico accetti e conservi gli zero iniziali... magari posso sbagliare.

    Il mio suggerimento è invece usare CAST() per fare una banale conversione al volo:

    SELECT tabella.* , CAST(campoBit AS SIGNED) AS mioCampoBit
    FROM tabella
    
    Poi, per ottenere i record in cui il campoBit ha almeno un bit è attivo, si può applicare il filtro :

    SELECT tabella.* , CAST(campoBit AS SIGNED) AS mioCampoBit
    FROM tabella
    WHERE CAST(UserName AS SIGNED) > 0
    
    ℹ️ Leggi di più su gibra ...

  10. #10
    lemorlenny non è in linea Novello
    Alla fine ho implementato un sistema suggerito sul forum inglese di mySql dove si assegna un peso ad ogni elemento che è il multiplo del precedente (1-2-4-8-16-32-64-128-256- .....) in questo modo se sommo i valori selezionati da ricercare, per es. il 1° ed il 5° elemento, estraggo il valore di 17, questo 17 è salvato nel record dati per quei record che hanno la 1° e la 5° selezione abilitate e facendo l'AND posso estrarlo; se poi il record dati avesse anche altre selezioni, es.1°,3°,4° selezione, che farebbe 13, facendo l'AND con il 17 il record viene comunque estratto perchè il 1° elemento è presente. Non so se mi sono spiegato chiaramente comunque qui c'e' il link al thread citato:
    dev.mysql.com/doc/refman/5.5/en/bit-functions.html.

    Grazie e Saluti

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. query a campi incrociati e conteggi su campo booleano
    Da Diego1966 nel forum Microsoft Access
    Risposte: 9
    Ultimo Post: 28-06-2019, 13:43
  2. [VBA Excel+Access 2010] Valore booleano in una query
    Da DavideV nel forum Microsoft Access
    Risposte: 3
    Ultimo Post: 26-04-2011, 12:25
  3. query - confronto di campi (della stessa query)
    Da Lindo nel forum Microsoft Word
    Risposte: 2
    Ultimo Post: 25-08-2010, 17:57
  4. query per confronto stringhe
    Da luciana1960 nel forum Microsoft Word
    Risposte: 5
    Ultimo Post: 19-07-2010, 17:44
  5. Query confronto tabelle
    Da simona.s nel forum Microsoft Word
    Risposte: 17
    Ultimo Post: 25-01-2010, 14:22