Créer une requête complexe pour exécuter des requêtes stockées dans une colonne?

J'essaie d'get des informations à partir d'une table, lorsqu'une (une ou plusieurs) condition (s) est (sont) remplie (s) mais que ces conditions sont stockées dans une autre table.

Voici une capture d'écran des 3 tables:

les tables

J'ai donc besoin d'une requête pour faire ceci:

  1. Étant donné un statut ( IDStatus ) et une action ( IDAction )
  2. S'il y a un IDCondition (il peut être NULL , un, ou plus d'un)

    A. S'il y en a un, utilisez IDocField tant que colonne à partir d'une table appelée IDoc , en utilisant ConditionOperator comme condition (lisez ceci comme = , < , > ) et la valeur sur ConditionValue .

    B. S'il y en a plus d'un, le même que précédemment, mais utilisez chaque condition avec AND .

    C. Si c'est NULL , allez directement au point 3

  3. Obtenir Subject , SendTo , CC , CCO et FileTemplate qui correspond à tout ce qui est expliqué ci-dessus.

Je veux essayer ceci parce que cela réduirait mon code C #, mais si cela est trop complexe ou non plausible, je ferai plusieurs requêtes comme ce que j'ai expliqué ci-dessus.

Je request ceci, parce que je ne suis pas sûr de savoir comment get plusieurs conditions dans un SELECT . Je veux dire par là:

S'il y a plus d'une condition, comment puis-je les exécuter ou les get toutes en une seule requête, mais cela a toutes les choses qui reviennent au point 3?

Exemple:

 SELECT * FROM WF_MailCondition WHERE IDCondition = 1 

cela returnnera toutes les conditions (les keys peuvent répéter) qui ont IDCondition égal à 1. Mais alors je dois utiliser toutes les trois colonnes pour créer une condition comme ID = 1 ID dans IDocField , = dans ConditionOperator et 1 dans ConditionValue .

Je sais qu'il y a quelques incohérences dans l'image, comme IDCondition est NN (pas nul) mais j'ai dit que ça peut être nul (je corrige ça).

Mon SQL:

 SELECT Subject, SendTo, CC, CCO, FileTemplate FROM WF_Mail AS M INNER JOIN WF_MailStatusAction AS S ON S.IDMail = M.IDMail WHERE (SELECT "HERE SELECT THE 3 COLUMNS TO USE A CONDITION" FROM WF_MailCondition WHERE IDCondition = S.IDCondition) AND (S.IDAction = "ACTION FROM OUTSIDE" AND S.IDStatus = "STATUS FROM OUTSIDE") 

Comment faire le SELECT "HERE SELECT 3 COLUMNS..." et si l' IDCondition est NULL get directement les colonnes demandées dans le premier SELECT ( Subject , SendTo , etc.)

Le "ACTION FROM OUTSIDE" est une déclaration paramétrée.

Oubliez les foreign keys, nous ne les utilisons pas (décisions du patron …).

Je fais cela parce que c'est pour une chose «événement». J'appelle une méthode dans mon code C # qui verra s'il y a des mails à envoyer. Mais ces mails ne peuvent en avoir aucune, une ou plusieurs conditions. C'est d'avoir plus d'options que tous doivent envoyer un mail. Peut-être que dans le stream de travail il n'y a pas besoin d'envoyer un email mais que le code est "codé en dur" donc je suis totalement libre de faire ce dont j'ai besoin à propos de cette fonctionnalité.

Peut-être que tout cela peut être une fonction ou une procédure stockée, mais je suis très ignorant à ce sujet et la performance avec eux.

Si vous avez besoin de plus d'informations, s'il vous plaît dites-moi.

D'après ce que je comprends, j'écrirais une requête comme celle-ci:

 select m.subject, m.cc from wf_mail m where exists (select 'true' from wf_mailstatusaction s, wf_mailcondition c where s.idmail=m.idmail and s.idcondition = c.idcondition and c.idocfield||c.conditionoperator||c.conditionValue = 'id>500' group by s.idcondition having count(s.idcondition) = 1) or exists (select 'true' from wf_mailstatusaction s, wf_mailcondition c where s.idmail=m.idmail and s.idcondition = c.idcondition and c.idocfield||c.conditionoperator||c.conditionValue IN ('id>500', 'id<200') group by s.idcondition having count(s.idcondition) > 1) or exists (select 'true' from wf_mailstatusaction s where s.idmail=m.idmail and s.idcondition is null) 

Je suggère ce qui suit: – Créer une class QueryBuilder Où vous avez des methods comme:

 * AddSelect() * AddFrom() * AddWhere() * ToSsortingng() ... 

Et puis utilisez le "middlelayer" pour gérer la requête en fonction des conditions. De cette façon, vous avez le plus de contrôle sur tout ce qui se passe