in reply to DBI SQLite statement problem with %

What's wrong? :) First of all, it is using dynamic sql. Use a placeholder instead:

Second, passing an optional clause like this can actually slow things down. You should instead have two queries, to have execution shorter and cleaner. Regardless, assuming CASE is supported, and no values have underscore or percent signs in them, you can change it to:

Tag1 LIKE CASE ? WHEN NULL THEN Tag1 ELSE ? END AND Tag2 LIKE CASE ? WHEN NULL THEN Tag2 ELSE ? END

If using =, it would be better, but the point is, checking equality for a column against itself is better then LIKE '%'. Another option, assuming any character can be guaranteed to not be used, for example '!':

? IN (Tag1, '!') AND ? IN(Tag2, '!');

Of course, an ugly where construct should also work:

(? IS NULL OR Tag1 LIKE ?) AND (? IS NULL OR Tag2 LIKE ?);