SQL LIKE条件检查整数?

Asked
Viewd141041

78

我正在使用一组SQL LIKE条件来遍历字母并列出以适当字母开头的所有项目,例如获取标题以字母“ A”开头的所有书籍:

 SELECT * FROM books WHERE title ILIKE "A%"
 

这对字母很好,但是我如何列出所有以任何数字开头的项目?值得的是,它在Postgres DB上。

8 个答案

152

这将(通过正则表达式)选择每本以数字开头的书名的书,这就是您想要的吗?

 SELECT * FROM books WHERE title ~ '^[0-9]'
 

如果您想要以特定数字开头的整数,可以使用:

 SELECT * FROM books WHERE CAST(price AS TEXT) LIKE '123%'
 

或使用(如果您所有的数字都具有相同的数字(那么约束将很有用))

 SELECT * FROM books WHERE price BETWEEN 123000 AND 123999;
 
  • 尝试op2时出现“不允许从数据类型从int到文本的显式转换。”

    GiladDecember 13, 2011 13:38
  • 如果选项2返回上面注释中提到的显式转换错误(可能在SQL Server和其他程序中可能发生),请尝试使用具有足够大的最大大小的VARCHAR:SELECT * FROM books WHERE CAST(price AS VARCHAR(20))喜欢'%123%'

    bstrongJanuary 20, 2017 21:33
1

假设您要查找的是“以7开头的数字”而不是“以7开头的字符串”,

 select * from books where convert(char(32), book_id) like '7%'
 

或与convert等效的Postgres。

18

PostgreSQL支持正则表达式匹配

因此,您的示例如下

 SELECT * FROM books WHERE title ~ '^\d+ ?' 
 

这将匹配以一个或多个数字开头的标题以及一个可选的空格

0

其中哪一个可索引?

这绝对是btree可索引的:

 WHERE title >= '0' AND title < ':'
 

请注意,':'在ASCII的'9'之后。

2

我在这里参加聚会很晚,但是如果您要处理固定长度的整数,则可以进行整数比较:

 SELECT * FROM books WHERE price > 89999 AND price < 90100;
 
2

在PostgreSQL 9.5上测试:

-仅数字

 select * from books where title ~ '^[0-9]*$';
 

 select * from books where title SIMILAR TO '[0-9]*';
 

-以数字开头

 select * from books where title ~ '^[0-9]+';
 
0

在PostgreSQL中,您可以使用 SIMILAR TO 运算符(更多

 -- only digits
select * from books where title similar to '^[0-9]*$';
-- start with digit
select * from books where title similar to '^[0-9]%$';
 

  • 在PostgreSQL 9.5中似乎SIMILAR TO不能使用“ ^”; POSIX正则表达式“〜”有效。

    Charlie 木匠October 18, 2018 17:06
  • 仅数字:标题〜‘^ [0-9] * $’;

    Charlie 木匠October 18, 2018 16:51
5

如果要搜索为字符串,可以将其转换为以下文本:

 SELECT * FROM books WHERE price::TEXT LIKE '123%'