--- In [email protected], Svein Erling Tysvær 
<svein.erling.tysvaer@...> wrote:
>
> > POSITION(sep || soughtval || sep in sep || searchedvaluelist || sep) > 0
> >
> > Adding sep before and after each string makes sure you don't get false 
> > hits, like '12' 
> > in '341256,234,567' where '12' appears inside '341256', but ',12,' doesn't.
> 
> Good idea, Kjell, but then why not use CONTAINING as an alternative to 
> POSITION?
> 
> sep || searchedvaluelist || sep CONTAINING sep || soughtval || sep
> 
> or in Bhavbhutis case:
> 
> WITH TMP (cSaleInvIDs) AS
> (SELECT ',' || cSaleInvIDs || ',' FROM tSaleInvoiceCvrLtr WHERE iID = 993)
> 
> SELECT tSaleinvoice.*
> FROM tSaleInvoice tSI
> WHERE (tSI.iID IN (24315,24371)
>    AND EXISTS(SELECT * FROM tSaleInvoice tSI2 
>               WHERE tSI2.iBuyerID = 1583 
>                 AND CAST(tSI2.tDt AS DATE) = CAST('2012-03-31' AS DATE)
>                 AND tSI.iID = tSI2.iID))
>    OR (tSI.iID NOT IN (24315,24371)
>    AND (SELECT TMP.cSaleInvIDs FROM TMP) CONTAINING ','|| tSI.iID || ',')
> 
> (I've taken one of Bhavbhutis intermediate examples as a guide and assumed 
> that iID is never NULL)
> 
> Performancewise, it might actually turn out not all too bad, assuming 
> tSaleInvoice.iBuyerID and tSaleInvoiceCvrLtr.iID are indexed, although I must 
> admit having a list of integers in a (VAR)CHAR field complicates the SQL.
> 
> HTH,
> Set
>

Thanks a lot Svein, taking your help from here and Norman on the other related 
thread this is my final query that I have implemented and it looks as follows

SELECT tSaleinvoice.*
   FROM tSaleInvoice
   WHERE (SELECT ',' || LIST(tSI.iID) || ',' FROM tSaleInvoice tSI JOIN 
tSaleInvoiceCvrLtr tSICL ON tSICL.iID = :vp_iID WHERE tSI.iBuyerID = 
tSICL.iBuyerID AND CAST(tSI.tDt AS DATE) = CAST(tSICL.tDt AS DATE) AND 
COALESCE(tSICL.cSaleInvIDs, '') = '')
      CONTAINING ',' || TRIM(CAST(tSaleInvoice.iID AS CHAR(12))) || ','
UNION
SELECT tSaleinvoice.*
   FROM tSaleInvoice
   WHERE (SELECT ',' || TRIM(cSaleInvIDs) || ',' FROM tSaleInvoiceCvrLtr WHERE 
iID = :vp_iID)
      CONTAINING ',' || TRIM(CAST(tSaleInvoice.iID AS CHAR(12))) || ','

Somehow the CASE WHEN COALESCE() was failing in Report Manager (but not in 
FlameRobin) and the iBuyerID + tDt logic always fired irrespective of 
cSaleInvIDs values but the above UNION and putting the COALESCE in the 
sub-selected helped me distinguish the required logic.

Thanks a lot

Kind regards
Bhavbhuti


Reply via email to