Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1691 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Select where avec plusieurs valeurs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Select where avec plusieurs valeurs

n°2389554
daniel-12
Posté le 29-06-2021 à 22:42:25  profilanswer
 

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
mood
Publicité
Posté le 29-06-2021 à 22:42:25  profilanswer
 

n°2389555
daniel-12
Posté le 29-06-2021 à 22:44:03  profilanswer
 

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

n°2389581
rufo
Pas me confondre avec Lycos!
Posté le 30-06-2021 à 10:28:38  profilanswer
 

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
n°2389627
pluj
Posté le 30-06-2021 à 16:34:18  profilanswer
 

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
n°2389628
rufo
Pas me confondre avec Lycos!
Posté le 30-06-2021 à 16:38:15  profilanswer
 

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
n°2389661
daniel-12
Posté le 30-06-2021 à 22:35:18  profilanswer
 

rufo a écrit :

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


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

n°2389662
daniel-12
Posté le 30-06-2021 à 22:46:15  profilanswer
 


 

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

n°2389666
daniel-12
Posté le 30-06-2021 à 23:17:00  profilanswer
 

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

n°2389667
pluj
Posté le 30-06-2021 à 23:40:53  profilanswer
 

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
n°2389668
daniel-12
Posté le 01-07-2021 à 00:33:00  profilanswer
 

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à
 

mood
Publicité
Posté le 01-07-2021 à 00:33:00  profilanswer
 

n°2389669
rufo
Pas me confondre avec Lycos!
Posté le 01-07-2021 à 08:05:39  profilanswer
 

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
n°2389825
djinto
Posté le 03-07-2021 à 07:38:20  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Select where avec plusieurs valeurs

 

Sujets relatifs
HTML Select et OnClick() ne fonctionne pas sur SafariAide Batch copy + rename (plusieurs dossiers a traiter en même temps)
Récupérer les valeurs d'un csv et changer le format au volImpossible de mettre plusieurs favicon sur meme site
CSS qui modifie plusieurs sites contre mon gré..Afficher plusieurs webcams du monde entier sur un ecran
VBA PPT - Sélectionner plusieurs Shape pour appliquer une animationPostGrSQL SELECT DISTINCT un truc pas clair SVP
ouvrir plusieurs URL simultanément ?Passer les guillemets dans un SELECT Potgresql #%@* WTF !!
Plus de sujets relatifs à : Select where avec plusieurs valeurs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR