Jeff Urlwin writes: > This might be a bit off topic, but... > [snip] > > > > ... WHERE (product_code = ? OR (? IS NULL AND > > product_code IS NULL)) > > > > and bind the same value to both placeholders. > > > > I understand the reasoning for this, and why it's the only way for > > database servers that don't understand "= null". > > > > However this syntax does NOT work with DBD::Sybase because of the way > > OpenClient handles the prepare. The issue is the "? is null" part: > > neither the Sybase client libs, nor the server can determine what > > datatype the placeholder is supposed to be, and I see no way to add a > > directive to tell the server that this item is of the same type as > > "product_code". > > Does any database understand ? is null or ? = 3 or ? = 'foo', given that ? > must be a column/function or some other name important for the query parsing > (i.e. not a "value" per se)?
Well - according to the DBI docs they do. And I can definitely write similar code in Transact SQL, for example in a stored proc: create proc foo (@p varchar) as select ... from sometable where (name = @p or (@p is null and name is null)) etc... > > Sybase, on the other hand, understands "= null". > > > > That's handy. Indeed. > > I'll document this in the DBD::Sybase docs, but I just wanted to flag > > the fact that the method documented in the DBI docs is unfortunately > > not portable to Sybase (and *probably* not to ODBC when using a > > Sybase). I don't know if ODBC w/MS-SQL handles this correctly or not. > > Which part, the = null or the ? is null? > > With SQL Server 2000 and DBD::ODBC, > col_a = null returns no rows > col_a is null returns 1 row > ? is null (passing col_a) returns 0 rows Ah. I wonder how the "? is null" bit is handled at the protocol level... Michael -- Michael Peppler - Data Migrations Inc. - http://www.mbay.net/~mpeppler [EMAIL PROTECTED] - [EMAIL PROTECTED] International Sybase User Group - http://www.isug.com