SQL Between clause with strings columns

可紊 提交于 2019-12-27 14:55:33

问题


I want to make a search using "between" clause over a string column. Doing some test I got this:

Let's assume that there is a country table with a "name" column of type varchar. If I execute this query:

Select * from country where name between 'a' and 'b'

I got this result:

Argentina
.
.
.
Argelia.

It excludes those countries that starts with B which I found a little bit weird.

Is there a way to do this search in a more accurate way? Any other ideas for make this search?

Thanks in advance


回答1:


The expression

name between 'A' and 'B'

is equivalent to

name>='A' and name<='B'

So 'Argentina' is >='A' and <='B' and it satisfies the condition. But 'Bolivia' is NOT <='B'. 'Bolivia'>'B'. It doesn't just look at the first letter: it looks at the whole string. Which is surely the way it ought to be: if it didn't do this, there'd be no way to say that you wanted a range that included 'Smith' but not 'Smithers'.

To accomplish what you want, you could say:

substr(name,1,1) between 'A' and 'B'

or:

name like 'A%' or name like 'B%'

or:

name>='A' and name<'C'



回答2:


i think i know how to solve your problem. u can try adding extra character in the back like this

select * from tablea where column1 between 'ABC' and 'ACD'+'Z'

this will return a result from ABC% to ACE




回答3:


Another query that would get countries that start with b as well as A, would be:

Select * from country where name between 'a' and 'c'



回答4:


The result's accurate, but you may be misunderstanding. x between a and b means x>=a and x<=b. (See the PostGRES documentation for details.)

If you want to get lines that start with either an a or a b, say what you mean:

select * from country where name like 'a%' or name like 'b%'

like uses the table indices so you'll get full performance for using this.




回答5:


Select * from country where substring(name FROM 1 FOR 1) between 'A' and 'B';



回答6:


The reason this statement didn't work is SQL pads the string with whitespace until it's the same length as the comparing string. So, in comparison, sql compared b followed by several blanks with b******. Because whitespace appears before all the other letters, sql decided b***** came after b[6 spaces]. So it shouldn't be displayed.



来源:https://stackoverflow.com/questions/5980783/sql-between-clause-with-strings-columns

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!