MySQL verkeerde uitvoer met IN-component en parameter

Ik heb het moeilijk met een vraag in MySQL.

Ik werk met Delphi XE en ik stuur een query met een parameter naar MySQL. Hier is een voorbeeld voor de zoekopdracht:

SELECT * FROM users u WHERE u.id IN (:idUsers);

De ': idUsers' is de variabele die de parameter die ik verzend met Delphi zal ontvangen, wat een string is die dat op deze manier geformatteerd heeft, bijv .: 1,2,3

Het probleem is dat ik met deze reeks alleen de eerste gebruiker ontvang (id = 1). Van wat ik kan zien, voegt het net als MySQL een quote ('') toe aan het begin en aan het einde van de string die ik stuur, alsof het '1,2,3' in plaats van 1,2,3 was. Ik heb deze selectie geprobeerd:

SELECT * FROM users u WHERE u.id IN ('1,2,3'); 

en het geeft inderdaad alleen de eerste gebruiker terug ..

Ik had een functie in MSSQL die de door mij verzonden string splitste en een tijdelijke tabel terugstuurde, maar we zijn onlangs overgeschakeld naar MySQL en van wat ik lees, staat MySQL het niet toe een tabel te retourneren.

Heeft iemand een idee hoe dit probleem op te lossen? Ik heb het web gesloopt voor een antwoord en heb er geen gevonden voor dit specifieke probleem.

Bedankt voor de hulp.

5
Kan je jouw code hier plakken? Ik heb een vergelijkbare vraag gebruikt en deze fout heb ik nooit ontdekt.
toegevoegd de auteur Shirish11, de bron

2 antwoord

Parameters werken niet zo; ze hebben geen idee dat wat u probeert aan te bieden een door komma's gescheiden lijst met waarden is. Als u ParamByName ('WhatEver'). AsString of Value instelt, betekent dit dat u een tekenreeks bedoelt die alles bevat wat in die parameter hoort. Dus het doet precies wat het lijkt te zijn - het gaat over IN ('1, 2, 3') , in plaats van de bedoelde IN (1, 2, 3) .

U moet ofwel zelf gaan analyseren en een tijdelijke tabel gebruiken, of de WHERE -clausule dynamisch bouwen en samenvoegen voordat u de query uitvoert. (Eigenlijk kunt u de query dynamisch opbouwen, een nieuwe parameter maken voor elk van de items in de IN -clausule en vervolgens doorlopen en waarden aan elk van die dynamisch gemaakte parameters toewijzen, maar dat wordt erg lelijk erg snel.)

10
toegevoegd
:) Ik ben blij dat je het hebt laten werken. Klinkt als een fijne oplossing (zolang je je geen zorgen hoeft te maken over SQL-injectie).
toegevoegd de auteur Ken White, de bron
Heel erg bedankt voor je antwoord. Het samenvoegen van de query binnen Delphi en vervolgens het uitvoeren van de query werkt. Het dynamisch opbouwen van de query zou niet hebben gewerkt omdat ik de query ophaal uit een tabel die alle queries bevat die in de applicatie nodig zijn. Wat ik deed is de parameter ": idUsers" vervangen door "$ idUsers" en binnen Delphi doe ik een AnsiStrReplace van "$ idUsers" met een string die ik van tevoren heb gebouwd.
toegevoegd de auteur Simon, de bron

Als u een variabel aantal parameters in de IN-component hebt, kunt u een tijdelijke tabel maken in MYSQL (die alleen een kolom met de naam ID bevat), de parameterwaarden in de tijdelijke tabel laden en vervolgens zoiets als dit doen:

SELECT * FROM users u WHERE u.id IN (SELECT ID FROM TEMPTABLE); 

Zolang de TEMPTABLE alleen de waarden bevat die u wilt opvragen, is de tabelruimtescan acceptabel.

U kunt dan een variabel aantal waarden hebben. U kunt de tabel ook permanent maken en de parameters opslaan. Voeg een kolom toe voor de gebruiker en elke gebruiker kan zijn individuele parameters opslaan.

0
toegevoegd
Dit is al genoemd, zowel in de oorspronkelijke vraag als in mijn antwoord. :)
toegevoegd de auteur Ken White, de bron
Sorry de vermelding gemist
toegevoegd de auteur David, de bron