0
votes

Comment utiliser l'opérateur SQL lorsque j'ai un ensemble de valeurs pour vérifier que tout match suffira?

Je passe la requête suivante où les deux tables sont constituées d'une colonne entière: xxx

Je prépare la requête SQL ci-dessus pour une instance de serveur MySQL et dans le cadre de cette requête que je veux Vérifiez si une certaine valeur est contenue dans un ensemble. J'ai atteint qu'avec la syntaxe suivante:

2202 dans (SELECT * des chiffres)

Cependant, j'ai aussi un cas où tout match d'un ensemble de valeurs suffit. En pseudo-SQL, j'aimerais faire quelque chose comme ceci: (2202, 2203, 2204) dans (sélectionnez * à partir de chiffres) qui ne fonctionnera évidemment pas.

En raison de la nature des données, je souhaite éviter une explosion logique sous la forme de:

2202 dans (sélectionnez * des chiffres) ou 2203 dans (sélectionnez * des chiffres) ou 2204 dans (Sélectionnez * à partir de chiffres)

Étant donné que la terminologie concernant ma question est assez générale (le mot clé est dans ), je n'ai pas trouvé de questions décrivant mon problème, Même si je crois qu'il y ait.

Quelle est la meilleure façon de réaliser le résultat souhaité? Une approche que je peux penser à utiliser une jointure interne sur les deux ensembles et voir si les rangées retournées sont plus grandes de 0, mais je ne peux pas penser à un moyen d'exprimer cela.


6 commentaires

Cherchez-vous l'inverse? Sélectionnez * à partir de numéros où MyColumn in (2202.2203.2204) ?


Votre question n'est pas claire pour moi .. Veuillez mettre à jour votre question Ajoutez un échantillon de données approprié et le résultat de l'expecse


S'il vous plaît montrer la requête complète.


J'ai mis à jour la réponse pour inclure la requête initiale complète. Les conceptions de tables ne sont pas incluses, car elles ne sont qu'une seule colonne constituée d'entiers.


Veuillez partager la structure de la table et quelques données d'échantillonnage.


@Nicohaase qui ne semble plus nécessaire car d'autres ont saisi le problème assez clairement. Pour créer la table: Créer des numéros de table (numéro INT); et l'autre table est exactement identique, avec un nom différent (soménumbers). Vous pouvez remplir tous les entiers que vous souhaitez trouver des données d'échantillon. Je ne pense pas que cela compte pour cette question.


5 Réponses :


1
votes

A en clause peut être refacturé comme une jointure interne xxx


0 commentaires

1
votes

pouvez-vous utiliser wind_in_set et une variable?

quelque chose comme: xxx

https://dev.mysql.com/doc/refman/8.0/fr/string -fonctions.html # Function_Find-in-Set


0 commentaires

1
votes

Créez une table temporaire avec toutes les valeurs dont vous avez besoin (2202, 2203, 2204, ...). Joindre à l'autre table.


0 commentaires

0
votes
... WHERE EXISTS (SELECT * as n FROM numbers HAVING n IN (2202, 2203, 2204))

3 commentaires

Pouvez-vous expliquer cela plus loin? Comment cet extrait peut-il insérer 2, 1 ou 0 dans une nouvelle table?


Cela ne peut pas, cela répond à la question initiale de trouver une intersection de deux listes. Il n'y avait à l'origine aucune mention de cartographie des valeurs. La cartographie Les valeurs nécessitent un code répétitif ou une table pour fournir cette cartographie. La question est horriblement écrite.


Merci d'éviter la réponse non motivée. La solution et uniquement qui s'expliquent rarement à d'autres personnes qui ne connaissent pas le contexte.



0
votes

Vous pouvez utiliser exister code> conditions, comme:

insert into othernumbers(number)
values(
    case
        when exists (
            select 1
            from numbers
            where num in (2202, 2203, 2204)
        ) then 2
        when exists (
            select 1
            from numbers
            where num = 2201
        ) then 1
        else 0
    end
);


0 commentaires