0
votes

Comment utiliser plusieurs entrées dans la clause where?

J'ai quatre-vingt-dix REFNO de commande client et je souhaite les inclure tous dans la clause WHERE.

J'ai écrit ceci:

select * 
from  TO_SALES_INVO 
where REFNO = '201582255'

Ce qui précède me renverra un enregistrement . Mais maintenant, j'ai la liste des REFNO (20190525,2018525, etc.) et je veux tous les sélectionner en utilisant SQL. Le REF No n'est dans aucune séquence ou plage et ils sont aléatoires. Néanmoins, je veux le résultat dans le même ordre que celui que j'ai mis dans la clause WHERE . Par exemple: où REFNO entre ('12', '2', '' 5 ',' 1 ') doit être ordonné de la même manière que dans les parenthèses.

Comment faire?

Remarque: J'utilise Toad


1 commentaires

Vous dites que vous utilisez TOAD. Mais c'est un outil de développement. Quel outil vos utilisateurs utiliseront-ils pour exécuter cette requête? D'où viennent les REFNO? Comment sont-ils stockés?


6 Réponses :


2
votes

S'ils ne sont pas dans une séquence ou une plage, vous pouvez les lister dans une condition IN.

select * from  TO_SALES_INVO 
where REFNO in (select REFNO from ...)

Si vous pouvez obtenir uniquement les numéros de référence souhaités dans une requête , alors vous pouvez l'utiliser comme sous-requête au lieu de toutes les lister.

select * from  TO_SALES_INVO 
where REFNO in ('201582255', '20190525', '2018525', ...)


1 commentaires

cela est utile .. mais je veux que le résultat soit la même séquence que j'ai mis dans la clause where ... exemple: où REFNO in ('12', '2', '' 5 ',' 1 ') doit être ordonné de la même manière que dans les parenthèses



4
votes

Vous pouvez utiliser l'opérateur IN :

SELECT * FROM TO_SALES_INVO WHERE REFNO IN (201582255, 20190525, 2018525)

Remarque: si le type de données de REFNO est numérique, alors n'entourez pas les valeurs avec des guillemets simples.


4 commentaires

cela est utile .. mais je veux que le résultat soit la même séquence que j'ai mis dans la clause where ... exemple: où REFNO in ('12', '2', '' 5 ',' 1 ') doit être ordonné de la même manière que dans les parenthèses


@Bodhi: sans clause ORDER BY , les jeux de résultats ne sont pas classés - la base de données est libre de renvoyer les données dans l'ordre qui lui convient. Si vous souhaitez que les données soient renvoyées dans un ordre particulier, vous devez utiliser un ORDER BY .


L'opérateur IN est utile s'il y a peu d'enregistrements impliqués, mais si le nombre d'enregistrements est élevé, pour des raisons de performances, le JOIN est plus approprié.


@Bodhi - si l'ordre de l'ensemble de résultats est important pour vous, vous devez inclure cette exigence dans votre question . De cette façon, vous ne devez le taper qu'une seule fois au lieu de commenter chaque réponse que vous obtenez, et les répondants savent qu'il y a une exigence spécifique (et astucieuse) à laquelle ils doivent répondre.



1
votes

Selon ce que je comprends, vous avez tous REFNO que vous pouvez passer à la clause sql IN comme,

select * from  TO_SALES_INVO 
where REFNO IN ('201582255', '20190525', '2018525', ...)


3 commentaires

cela est utile .. mais je veux qu'il ordonne le résultat de la même séquence que j'ai mis dans la clause where ... exemple: où REFNO dans ('12', '2', '' 5 ',' 1 ') devrait ordonner la même chose façon comme dans les parenthèses


@Bodhi Dans SQL, vous triez les résultats en utilisant commander par .


Oui, vous pouvez utiliser la commande par clause.



2
votes

En supposant que vous ayez la table ORDER avec le champ REFNO, vous pouvez essayer avec la requête:

SELECT * FROM ORDER t1 JOIN TO_SALES_INVO t2 on t1.REFNO=t2.REFNO;

Meilleur choix avec JOIN explicite:

SELECT * from ORDER WHERE REFNO in (SELECT REFNO FROM TO_SALES_INVO);

En général, je suggère d'adopter le JOIN explicite, car il a beaucoup d'avantage de performances en général que le IN (c'est-à-dire préférez le deuxième type de requête au lieu du deuxième type de requête).


1 commentaires

J'étais en train de taper ma réponse lorsque votre réponse est arrivée. Pour autant de valeurs, chargez-les dans une table et rejoignez-la!



0
votes
SELECT *
FROM (select '12' as REFNO FROM DUAL
      UNION ALL
      select '2' FROM DUAL
      UNION ALL
      ....
     ) A
JOIN TO_SALES_INVO ON ...
Please notice that you must use UNION ALL instead of UNION or there will be a grouping performed in sub query "A" which will change the order.

0 commentaires

0
votes

Cela devrait obtenir les résultats souhaités, même si la syntaxe de la liste des valeurs REFNO est un peu différente (c'est-à-dire une chaîne séparée par des virgules). Il génère un ensemble de lignes pour les éléments sur lesquels vous filtrez, puis les joint.

Il utilise une technique pour diviser la valeur séparée par des virgules comme trouvé ici .

WITH
    DATA AS (SELECT '12,2,5,1' str FROM DUAL),
    LOOKUP AS
    (
        SELECT LEVEL lvl, REGEXP_SUBSTR (str, '[^,]+', 1, LEVEL) str FROM DATA
        CONNECT BY REGEXP_SUBSTR (str, '[^,]+', 1, LEVEL) IS NOT NULL
    )
SELECT TO_SALES_INFO.*
  FROM LOOKUP INNER JOIN TO_SALES_INFO ON LOOKUP.str = TO_SALES_INFO.REFNO
  ORDER BY LOOKUP.lvl;

Si votre liste de valeurs REFNO va être réutilisée, il est probablement préférable de simplement créer une table séparée pour elles plutôt que d'utiliser le truc complexe CONNECT BY que j'ai montré.


0 commentaires