Select where avec plusieurs valeurs

Select where avec plusieurs valeurs - SQL/NoSQL - Programmation

Marsh Posté le 29-06-2021 à 22:42:25    

Bonjour,  
 
j'ai une table1   en SQLite3 qui contient dans   col1    des valeurs du genre:
je cherche toutes les ligne contenant D53110000, D53117980, D53116700....
ma list, c'est 50000 éléments...., la table 2 500 000 lignes
 
col1
D53110000_000_blablablbla
D53110460_000_blablablbla
E53117980_000_blablablbla
G53110870_000_blablablbla
D53116700_000_blablablbla
H53110000_000_blablablbla
F53110460_000_blablablbla
D53117980_000_blablablbla
U53110870_000_blablablbla
D53116700_000_blablablbla
 
cette table, je l'ai créé , je peux donc la créer différement
 
 
je sais faire un
 
SELECT * FROM table1 WHERE col1 like 'D531%'  qui me donnera toutes les lignes avec D531, mais je ne les veux pas toutes, seules celles de la liste
 
 
list = ['D53110000','D53117980','D53116700']
id_tuple = tuple(list)
SELECT * FROM table1 WHERE col1 IN {}'.format(id_tuple)
 
ca marche très bien, sauf que ma colonne doit contenir EXACTEMENT la valeur de la liste.
la liste et tuple viennent d'un scritp python
 
j'ai essayé cela, mais ça ne marche pas
list = ['D53110000%','D53117980%','D53116700%']
 
mon idée est de faire une autre colonne avec les 9 premier caractère seulement, mais j'aimerai éviter, si la solution n'est pas trop complexe
 
vous avez une idée évitant la création d'une autre colonne?


Message édité par daniel-12 le 30-06-2021 à 22:04:38
Reply

Marsh Posté le 29-06-2021 à 22:42:25   

Reply

Marsh Posté le 29-06-2021 à 22:44:03    

... c'est quoi le paramètre de mon profil qui fait que les mise en page ne sont pas correcte ?!......

Reply

Marsh Posté le 30-06-2021 à 10:28:38    

WHERE nom_col IN ('D53110000', 'D53117980','D53116700', ...)

Message cité 2 fois
Message édité par rufo le 30-06-2021 à 10:31:23

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-06-2021 à 16:34:18    

Lu,
 

rufo a écrit :

WHERE nom_col IN ('D53110000', 'D53117980','D53116700', ...)


Avec un substr(ing) du coup :

Code :
  1. WHERE SUBSTR(nom_col, 1, 9) IN ('D53110000', 'D53117980','D53116700', ...)


?  :)

Message cité 1 fois
Message édité par pluj le 30-06-2021 à 16:36:08
Reply

Marsh Posté le 30-06-2021 à 16:38:15    

Ah, j'avais pas compris que col1 pouvait avoir une valeur contenant plusieurs valeurs que tu cherchais. Ben du coup, ça se rapproche pas mal d'un topic que j'ai récemment fait :
https://forum.hardware.fr/hfr/Progr [...] 8020_1.htm
 
Regarde si SQLite3 supporte les RegExp. Si oui, tu pourras t'inspirer de la solution proposée dans mon topic ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-06-2021 à 22:35:18    

rufo a écrit :

WHERE nom_col IN ('D53110000', 'D53117980','D53116700', ...)


 
 
ça ca ne fonctionne pas, car le texte contient du blabla derrière

Reply

Marsh Posté le 30-06-2021 à 22:46:15    


 

pluj a écrit :


Avec un substr(ing) du coup :

Code :
  1. WHERE SUBSTR(nom_col, 1, 9) IN ('D53110000', 'D53117980','D53116700', ...)


?  :)


 
 
ça c'est bien, le seul soucis c'est que je l'ai pas envie de renseigner la liste légèrement longue
 
mais finalement en adaptant:
list = ['D5314875', 'D53196276', 'D53134785', 'D53173094']
id_tuple = tuple(list)
query = 'select * from table1 WHERE SUBSTR(col1, 1, 9) IN {}'.format(id_tuple)
 
rappel : je travaille en python, je ne suis pas a 100% en SQL
 
 
bien entendu la liste de 4 éléments, je ne l'écrit pas, je la charge via une précédente requête ou d'un fichier
 
MERCI

Reply

Marsh Posté le 30-06-2021 à 23:17:00    

le SUBSTR en SQL ressemble au replace que je connais en python
 
dans ma col1, si j'ai une liste qui ressemble a la liste (s) ci dessous, supposons que je veuille garder les 12 premiers caractères mais sans les espaces, _, ou - . Comment faire en SQL
 
 
en python ce code fonctionne
 
import re
s=['D53112345-000_gsdhjgfsj','D53109876000_gsdhjgfsj','D531_09876_000_gsdhjgfsj']
 
 
for p in s:
    print (re.sub(r'-|_| ', '', p)[0:12])
 
résultat:
D53112345000
D53109876000
D53109876000

Reply

Marsh Posté le 30-06-2021 à 23:40:53    

Code :
  1. WHERE substr(
  2.    REPLACE(
  3.        REPLACE(
  4.            REPLACE(
  5.                nom_colonne,
  6.                '-',
  7.                ''
  8.            ),
  9.            '_',
  10.            ''
  11.        ),
  12.        ' ',
  13.        ''
  14.    ),
  15.    1,
  16.    12
  17. ) IN('D53112345000', 'D53109876000', 'D53109876000')


 
Mais vu qu'il est question de SQLite, il n'y a pas moyen d'enregistrer une fonction Python à toi qui te permettrait de faire ta petite cuisine dans ce langage tout en y ayant recours dans tes requêtes ? (on peut le faire en C, PHP et compagnie)
 

Citation :

bien entendu la liste de 4 éléments, je ne l'écrit pas, je la charge via une précédente requête ou d'un fichier


 

  • Si c'est d'une requête tu devrais pouvoir l'utiliser directement en sous-requête
  • Si c'est d'un fichier, j'aurais été en PHP, j'aurais généré le IN( ... ) par un implode + array_map avec PDO::quote et autres traitements comme substr en callback (pour Python je ne sais pas à quoi ça correspond mais il n'y a aucune raison de ne pas pouvoir réaliser l'équivalent)


Message édité par pluj le 30-06-2021 à 23:54:35
Reply

Marsh Posté le 01-07-2021 à 00:33:00    

la dernière question était de la curiosité, pour voir comment l'écrire.
 
je vais utiliser cette méthode:
query = 'select * from table1 WHERE SUBSTR(col1, 1, 9) IN {}'.format(id_tuple)
 
et faire en sorte que la BDD que je créé soit bien écrite. Je l'écris en passant par python, donc je peux en profiter pour nettoyer si besoin a ce moment là
 

Reply

Marsh Posté le 01-07-2021 à 00:33:00   

Reply

Marsh Posté le 01-07-2021 à 08:05:39    

daniel-12 a écrit :

le SUBSTR en SQL ressemble au replace que je connais en python
 
dans ma col1, si j'ai une liste qui ressemble a la liste (s) ci dessous, supposons que je veuille garder les 12 premiers caractères mais sans les espaces, _, ou - . Comment faire en SQL
 
 
en python ce code fonctionne
 
import re
s=['D53112345-000_gsdhjgfsj','D53109876000_gsdhjgfsj','D531_09876_000_gsdhjgfsj']
 
 
for p in s:
    print (re.sub(r'-|_| ', '', p)[0:12])
 
résultat:
D53112345000
D53109876000
D53109876000


DU SQL est très souvent généré par un langage de dév. Dans mon cas, c'est souvent du PHP. Que tu sois en Python n'est pas un pb. T'as regardé mon dernier post où je te parles d'une solution à base de regex qui sera bien plus propre que tes replaces ou autres manips ? (à condition que SQLite3 supporte les regexp, bien entendu).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-07-2021 à 07:38:20    

Bonjour,

 

pour créer la liste contenu dans IN ( ...... )

 

Comme une requete SQL c'est une chaine de caractère,
tu peux créer ta chaine avant la reqûête,
c'est du texte.
_liste_param = val1 + "," + val2 + "," + val3

 

une fonction 'serialize' existe peut être en Python ?

 

Avec une série de données 'serialize' fera une chaine unique

 

et , sauf besoin différent ,
le substring (  , 1 , 9 )...

 

dans LIKE , et IN , tu peux ajouter % ou _ (1 car) ou _____ ( 5 car ),
avant la chaine, dans la chaine , ou après.
% est nombre de caractère indeterminé ( longueur inconnue )
_ est pour 1 seul caractère ( longueur 1 )

 

resultat_chaine = ""
for each param IN list

 

resultat_chaine += substring(param,1,9) + ","

 

if param.rank  = list.last
resultat += param
fi

 

next

 

la_requete_SQL = select ... where  colonne IN ( resultat_chaine ) ;

 

de faire le substring () , ou le .format( ) , ou de construire une chaine avant la chaine SQL,

 

tu ne fera pas appel à la même fonctionnalité,
c'est à dire que ton 'programme' pourrait faire la chaine,
ou l'environnement Python,
ou le moteur SQL de SqlLite3.

 

C'est pas insignifiant, bien au contraire,
tu a un grand nombre de colonnes,
et tu décidera de les exècuter au niveau 'programme', ou dans l'environnement Python par appels de fonctions python, ou par le moteur SqlLite.

 

( Selon le besoin, c'est à choisir .. ou non .. )

 


Message édité par djinto le 03-07-2021 à 07:40:53

---------------
Nom : Prénom : Age : Adresse : Ville : Code Postal : Num Trois Tel
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed