On 2015-07-23 04:56 PM, Igor Tandetnik wrote:
> On 7/23/2015 10:47 AM, Bernardo Sulzbach wrote:
>>> select * from tbl1 where substr(col1,1,1) in ('A','a') and col1 like 
>>> 'a_c%';
>>
>> Just adding to Igor's answer:
>>   col1 between 'a' and 'b' or col1 between 'A' and 'B'
>
> That's not quite the same. BETWEEN is inclusive of both ends. ('b' 
> BETWEEN 'a' and 'b') is true.

To add:

I think someone suggested before to do things like  BETWEEN 'a' AND 
'azzzzzzzzzzzz' or similar because 'a' < 'aa' so alphabetical this 
should be correct. Of course if you wish to catch all words starting 
with 'a' the best is to supply the highest standard-printable character 
after the a, which in the normal ASCII set should be ~ so that BETWEEN 
'a' AND 'a~' should catch all normal ASCII strings, and then the 
extended set goes to 254 (which is hard to type on a keyboard) but you 
can do BETWEEN 'a' AND 'a'||char(254) etc.
ref: http://www.asciitable.com/   [1]

Of course once you get to UNICODE strings, the highest valid character 
that can follow 'a' becomes more complicated and encoding-dependent.

Therefore it is (to me) always the best to do: LIKE 'a%' - which the 
SQLite Query Planner knows to optimize and use against an index - plus 
keep using ci type collations (NOCASE in SQLite).

"WHERE substring(X,1,Y)" could similarly be optimized I guess, though 
that would fall in a category of use-cases that should be exceedingly 
rare (but if easy to do, can't be harmful to add).


Cheers,
Ryan


[1] For fun, notice how the characters [, /, ], ^ and _ follows after 
the capitals but before the lowercase letters, which ends up in some 
unexpected sorting cases where the following are all true:
'A' < '_A'  but 'a' > '_a'
or put another way:
'JohnAnderson' < 'John_Anderson' - but - lowercase('JohnAnderson') > 
lowercase('John_Anderson')
whereas...
'JohnAnderson' > 'John Anderson' - and - lowercase('JohnAnderson') > 
lowercase('John Anderson')

also...
'{A}' > '[b]' > '(z)'
'{A{B}' < '{A|B}' but '{A}B}' > '{A|B}'


Reply via email to