I didn't really look to hard, but you are nesting the nvl()'s I assume?
If so, yes, that is a thought I had (I am just nesting them in user land
instead of in sqla land) but that's really great if that works.
if you don't mind, add your comment to :
http://www.sqlalchemy.org/trac/ticket/1760
On 4/2/2010 7:08 PM, Ian Kelly wrote:
On Fri, Apr 2, 2010 at 3:41 PM, Michael Bayer
<mike...@zzzcomputing.com <mailto:mike...@zzzcomputing.com>> wrote:
Kent wrote:
> Along the same lines, is there something we can do about nvl()
> (oracle) versus coalesce() (ansi)?
>
> They aren't exactly the same, unfortunately (nvl takes exactly 2
> arguments, no more), so maybe there is nothing 'official' you
can do,
> but can you help me work it out for my project?
>
> I assume it is very similar to what you helped me out with
> above...something like this:
>
> ============================================================
> from sqlalchemy.sql.expression import ColumnElement
> from sqlalchemy.ext.compiler import compiles
> from sqlalchemy.types import DateTime, Date
>
> class current_date(ColumnElement):
> type = Date()
>
> @compiles(current_date)
> def _compiler_dispatch(element, compiler, **kw):
> if compiler.dialect.name <http://compiler.dialect.name> ==
'oracle':
> if compiler.dialect.use_ansi:
> return "trunc(current_date)"
> else:
> return "trunc(sysdate)"
> else:
> # assume postgres
> return "current_date"
> ============================================================
>
>
> But the main difference is it takes arguments.
>
> Is there a clever way to return the appropriate function, something
> like this:
>
> def ....
> if compiler.dialect.name <http://compiler.dialect.name> ==
'oracle':
> return func.nvl
> else:
> # assume postgres
> return func.coalesce
I will add this to the docs:
from sqlalchemy import *
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.expression import FunctionElement
class coalesce(FunctionElement):
name = 'coalesce'
@compiles(coalesce)
def compile(element, compiler, **kw):
return "coalesce(%s)" % compiler.process(element.clauses)
@compiles(coalesce, 'oracle')
def compile(element, compiler, **kw):
if len(element.clauses) > 2:
raise TypeError("coalesce only supports two arguments on
Oracle")
return "nvl(%s)" % compiler.process(element.clauses)
print coalesce(5, 6)
from sqlalchemy.dialects import oracle
print coalesce(5, 6).compile(dialect=oracle.dialect())
Might this work as a more complete solution for Oracle?
@compiles(coalesce, 'oracle')
def compile(element, compiler, **kw):
sql = "nvl(%s)"
for i in xrange(len(element.clauses) - 2):
sql %= "%s, nvl(%%s)" % compiler.process(element.clauses[i:i+1])
return sql % compiler.process(element.clauses[-2:])
Ian
--
You received this message because you are subscribed to the Google
Groups "sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.