0
votes

Comment dériver la condition de filtre des rangées de table

Comment puis-je dériver la condition de filtrage en BTEQ à base de lignes comme indiquées ci-dessous?

Tableau B: P>

SELECT * FROM TABLE A WHERE CODE IN ('AAA') AND DESC IN ('BBB') AND TYPE IN ('CCC')


4 commentaires

Ajoutez quelques autres données d'échantillonnage et spécifiez également le résultat attendu.


Combien de tables existent réellement ici?


On dirait que vous essayez de comparer la valeur de colb et COLC dans une rangée. Si tel est le cas, vous pouvez éventuellement utiliser un opérateur comme ou une comparaison de matrice. Quel est le type de données de colc ? Quelle est votre définition de dans dans votre pseudo-requête?


Cela semble être une demande d'utilisation de la table B pour générer des SQL dynamiques avec un nombre variable de prédicats faisant référence à des noms de colonne arbitraires et potentiellement des listes de valeurs de colonne. Bien qu'il soit possible de le faire dans BTEQ, vous préférez probablement mieux utiliser une langue de procédure (procédure stockée dans la base de données, le script Python sur le client, etc.) pour construire la requête.


4 Réponses :


2
votes

Une approche ici serait d'agréger par cola code>, puis ajoutez trois assertions pour la clé / les valeurs que vous attendez:

SELECT
    COLA
FROM yourTable
GROUP BY
    COLA
HAVING
    COUNT(CASE WHEN COLB = 'CODE' AND COLC = 'AAA' THEN 1 END) > 0 AND
    COUNT(CASE WHEN COLB = 'DESC' AND COLC = 'BBB' THEN 1 END) > 0 AND
    COUNT(CASE WHEN COLB = 'TYPE' AND COLC = 'CCC' THEN 1 END) > 0;


1 commentaires

Colb et COLC est dans la table B BL A . Vous avez seulement interrogé une table, alors comment est-ce censé travailler?



0
votes

Vous pouvez ré-écrire la requête à l'aide d'une expression de table commune.

SELECT *
FROM
(
SELECT COLA, CASE WHEN COLB = 'Code' THEN COLC ELSE NULL AS Code
           , CASE WHEN COLB = 'DESC' THEN COLC ELSE NULL AS DESC
           , CASE WHEN COLB = 'TYPE' THEN COLC ELSE NULL AS TYPE
FROM TABLEB
) AS t
WHERE  CODE IN ('AAA') AND DESC IN ('BBB') AND TYPE IN ('CCC');


1 commentaires

Colb et COLC est dans la table B BL A . Vous ne faites rien avec la table A , alors comment est-ce censé fonctionner?



0
votes

Table de filtre A code> à l'aide des valeurs du tableau B code> et en supposant qu'une colonne sans valeurs dans le tableau B code> signifie non filtré sur cette colonne , vous pouvez le faire comme ceci:

SELECT *
  FROM A
 WHERE ( NOT EXISTS ( SELECT * FROM B WHERE B.COLB = 'CODE' )
      OR A.CODE IN ( SELECT B.COLC FROM B WHERE B.COLB = 'CODE' ) )
   AND ( NOT EXISTS ( SELECT * FROM B WHERE B.COLB = 'DESC' )
      OR A.DESC IN ( SELECT B.COLC FROM B WHERE B.COLB = 'DESC' ) )
   AND ( NOT EXISTS ( SELECT * FROM B WHERE B.COLB = 'TYPE' )
      OR A.TYPE IN ( SELECT B.COLC FROM B WHERE B.COLB = 'TYPE' ) )


2 commentaires

Je ne vois aucune relation entre les tables "a" et "b" que ce soit et suppose que c'est juste une faute de frappe et qu'il n'y a qu'une seule table.


@TimbieGeleisen La relation est que b.colb contient le nom d'une colonne dans le tableau A et b.colc Contient la valeur pour correspondre dans ce tableau une colonne . Par devinez est que la valeur entière de b.cola représente la table A . C'est la seule façon dont la question ait du sens pour moi, mais cela fait beaucoup de sens de cette façon.



0
votes

Vous pouvez utiliser dans code> ou existant code> à cet effet: xxx pré>

La mise en garde est que cela suppose qu'il y a au moins Une de chaque valeur dans le tableau B code>. p>

Vous pouvez gérer les valeurs manquantes. Une méthode utilise des sous-requêtes supplémentaires: P>

select a.*
from a 
where (a.code in (select b.colc from b where b.colb = 'CODE') or
       not exists (select 1 from b where b.colb = 'CODE')
      ) and
      (a.desc in (select b.colc from b where b.colb = 'DESC') or
       not exists (select 1 from b where b.colb = 'DESC')
      ) and
      (a.type in (select b.colc from b where b.colb = 'TYPE') or
       not exists (select 1 from b where b.colb = 'TYPE')
      );


0 commentaires