Italian SQLite campo con id

Fulvio75

Well-Known Member
Licensed User
Ciao, ho una domanda da porre:
dato un campo di una tabella SQLite tipo text contenente degli id di riferimento a degli oggetti (campo X contiene 10,36,45,7) questi numeri sono gli id attribuiti agli oggetti in questione quindi un record di questa tabella punta a diversi oggetti (10,36,45,7) esiste una funzione in SQLite che è in grado di estrapolare ad esempio tutti i record di questa tabella contenenti es: 36 se ne esistono diversi di record contenenti questo numero?
Ho pensato a un regex.split(",",X) per ogni record e controllare se vi è il numero ma è troppo laborioso
 

Elric

Well-Known Member
Licensed User
Usa "GLOB" oppure "LIKE" nel comando SQLite.
dipende da cosa devi fare.
 

Fulvio75

Well-Known Member
Licensed User
Usa "GLOB" oppure "LIKE" nel comando SQLite.
dipende da cosa devi fare.
È un filtro e deve solo trovare tutti i record contenenti es: 36
Deve praticamente separate tutti gli altri valori anche se presenti
 

LucaMs

Expert
Licensed User
Longtime User
Prova:

SELECT * FROM NomeTabella WHERE INSTR(',' || NomeCampo || ',', ',' || ? || ',') > 0

in una istruzione ExecQuery2, passando il numero da cercare.


Nota: le || aggiungono una virgola all'inizio e una alla fine, "a runtime". Se puoi inserirle direttamente nel valore del campo, ovvero anziché scriverci:
10,36,45,7
tu potessi salvare nel campo:

,10,36,45,7,

la select sarebbe più semplicemente:

SELECT * FROM NomeTabella WHERE INSTR(NomeCampo, ',' || ? || ',') > 0

(ovviamente sprecheresti un po' di spazio nel db, quello delle 2 virgole)
 
Last edited:

Fulvio75

Well-Known Member
Licensed User
Prova:

SELECT * FROM NomeTabella WHERE INSTR(',' || NomeCampo || ',', ',' || ? || ',') > 0

in una istruzione ExecQuery2, passando il numero da cercare.


Nota: le || aggiungono una virgola all'inizio e una alla fine, "a runtime". Se puoi inserirle direttamente nel valore del campo, ovvero anziché scriverci:

tu potessi salvare nel campo:

,10,36,45,7,

la select sarebbe più semplicemente:

SELECT * FROM NomeTabella WHERE INSTR(NomeCampo, ',' || ? || ',') > 0

(ovviamente sprecheresti un po' di spazio nel db, quello delle 2 virgole)
instr conta i caratteri dall'inizio della striga alla prima lettera della stringa passata per la comparazione.
Ho trovato in giro nei vari forum alcuni che hanno lo stesso problema... un casino pessima idea mettere in una stringa separata da virgole gli id da cercare :-(.
La soluzione possibile è fortunatamente quella data da B4A.... Split per ogni record e cercare li il valore, le vecchie versioni di SQLite avevano Split ora l'hanno tolto.
 

LucaMs

Expert
Licensed User
Longtime User
instr conta i caratteri dall'inizio della striga alla prima lettera della stringa passata per la comparazione.
E allora?

strapolare ad esempio tutti i record di questa tabella contenenti es: 36 se ne esistono diversi di record contenenti questo numero?

Da ciò che hai scritto, sembra che ti interessi avere tutti i record in cui, nel tuo esempio, il 36 sia parte di quel campo; se è così la query funziona.
 

Fulvio75

Well-Known Member
Licensed User
E allora?



Da ciò che hai scritto, sembra che ti interessi avere tutti i record in cui, nel tuo esempio, il 36 sia parte di quel campo; se è così la query funziona.

si esatto, ho letto dal sito SQLite il funzionamento di INSTR e dice altro, ora provo e ti dico spero che funzioni così evito 2000000 di righe di codice :)))
 

Fulvio75

Well-Known Member
Licensed User
E allora?



Da ciò che hai scritto, sembra che ti interessi avere tutti i record in cui, nel tuo esempio, il 36 sia parte di quel campo; se è così la query funziona.
Funziona..... che culo, grazie
 

Fulvio75

Well-Known Member
Licensed User
Eh sì, sono stato fortunato 😂

(come al solito :()
Non ho capito a cosa servono tutte quelle , però.... intendo quelle prima della stringa contenente i miei numeri e le ||

ho letto questo e non centra una cippa :)
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Non ho capito a cosa servono tutte quelle , però.... intendo quelle prima della stringa contenente i miei numeri e le ||
Servono perché tu nel campo hai qualcosa tipo:

10,36,45,7
quindi 10 e 7 non sono "contornati" da virgole.
Se cercassi ,xx, non verrebbero trovati.

(il doppio pipe, ||, è il simbolo per la concatenazione di stringhe in SQLite, come avrai capito).
 

Fulvio75

Well-Known Member
Licensed User
Servono perché tu nel campo hai qualcosa tipo:


quindi 10 e 7 non sono "contornati" da virgole.
Se cercassi ,xx, non verrebbero trovati.

(il doppio pipe, ||, è il simbolo per la concatenazione di stringhe in SQLite, come avrai capito).
la prima parte tutto ok capito....
come avrai capito della parte || non ho capito una cippa, banana ecc ecc :)
però funziona :) :)
 
Top