On Sunday 09 September 2007 22:51:32 Michael Bayer wrote: > try calling scalar() on that subquery, it needs to be treated as > such. oops, forgot to mention: this is 0.3.xx. in 0.4 all is okay without scalars.
so, 0.3.latest, adding .scalar() after .correlate() complains about None having no .scalar attribute; adding .scalar() before the .correlate() gives: Traceback (most recent call last): File "tests/convertertest.py", line 144, in test4_balance_trans_via_prev_balance_date_subselect b.c.finaldate < balance.c.finaldate File "/home/az/src/dbcook/sqlalchemy/sql.py", line 1215, in scalar return self.execute(*multiparams, **params).scalar() File "/home/az/src/dbcook/sqlalchemy/sql.py", line 1208, in execute return self.compile(bind=self.bind, parameters=compile_params).execute(*multiparams, **params) File "/home/az/src/dbcook/sqlalchemy/sql.py", line 1097, in execute raise exceptions.InvalidRequestError("This Compiled object is not bound to any Engine or Connection.") InvalidRequestError: This Compiled object is not bound to any Engine or Connection. which is true, its all unbound. btw .scalar() behaves same in 0.4.. so i guess its not that. if its too much of a hassle, forget it, one testcase less when 0.3 (-;). svilen > On Sep 9, 2007, at 2:37 PM, [EMAIL PROTECTED] wrote: > > g'day. > > i have a subselect that may yield null (nothing found), and i > > want to treat that as value of 0. i've read about coalesce() that > > would return first non-null of its args. > > > > plain query looks like: > > > > expr = and_( trans.c.account.startswith( balance.c.account), > > trans.c.date) <= balance.c.finaldate, > > trans.c.date > select( [ func.max( b.c.finaldate)], > > b.c.finaldate < > > balance.c.finaldate ).correlate( balance) > > > > this gives something like: > > $print expr > > trans.account LIKE balance.account+'%' \ > > AND trans.date <= balance.finaldate \ > > AND trans.date > coalesce((SELECT max(b.finaldate) > > FROM balance AS b > > WHERE b.finaldate < balance.finaldate) > > > > > > adding coalesce breaks the subselect: > > > > expr = and_( trans.c.account.startswith( balance.c.account), > > trans.c.date) <= balance.c.finaldate, > > trans.c.date > func.coalesce( > > select( [ func.max( b.c.finaldate)], > > b.c.finaldate < > > balance.c.finaldate ).correlate( balance), > > 0 ) > > $print expr > > trans.account LIKE balance.account + '%' \ > > AND trans.date <= balance.finaldate \ > > AND trans.date > coalesce(NULL,0) > > > > removing the correlate() restores proper subselect, but now its > > not correlated, and has 'FROM balance as b, balance' in it... > > > > or should i use CASE instead? > > i'm sure i've misunderstood all this sql thing... > > (The subselect is just trying to find the date of previous row in > > table balance before current balance.finaldate, OR 0.) > > > > svilen > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---