SQL LIKE điều kiện để kiểm tra số nguyên?


82

Tôi đang sử dụng một tập hợp các điều kiện SQL LIKE để xem qua bảng chữ cái và liệt kê tất cả các mục bắt đầu bằng chữ cái thích hợp, ví dụ: để lấy tất cả các sách có tiêu đề bắt đầu bằng chữ "A":

SELECT * FROM books WHERE title ILIKE "A%"

Điều đó tốt cho các chữ cái, nhưng làm cách nào để liệt kê tất cả các mục bắt đầu bằng bất kỳ số nào? Đối với những gì nó đáng giá là điều này trên DB Postgres.

Câu trả lời:


159

Điều đó sẽ chọn (bằng một regex) mọi cuốn sách có tiêu đề bắt đầu bằng một số, đó có phải là điều bạn muốn?

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

nếu bạn muốn các số nguyên bắt đầu bằng các chữ số cụ thể, bạn có thể sử dụng:

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

hoặc sử dụng (nếu tất cả các số của bạn có cùng số chữ số (một ràng buộc sẽ hữu ích khi đó))

SELECT * FROM books WHERE price BETWEEN 123000 AND 123999;

1
Khi thử op2, tôi nhận được "Không cho phép chuyển đổi rõ ràng từ kiểu dữ liệu int sang văn bản."
Gilad

1
Nếu tùy chọn 2 trả về lỗi chuyển đổi rõ ràng được đề cập trong nhận xét ở trên (có thể xảy ra trong SQL Server và có thể là các chương trình khác), hãy thử sử dụng VARCHAR với kích thước tối đa đủ lớn: SELECT * FROM books WHERE CAST (giá AS VARCHAR (20)) THÍCH '% 123%'
bstrong

Cảm ơn rât nhiều! Tôi có thể thêm 5 xu: bạn cũng có thể sử dụng: [...] CAST (giá NHƯ VĂN BẢN) ~ * '123%' sử dụng toán tử ~ *. Ngoài ra, bạn có thể sử dụng bất kỳ regexps nào bên trong sau đó, như: [...] CAST (giá NHƯ VĂN BẢN) ~ * '^ 123 \ -? 456 $'
Arsenii

18

PostgreSQL hỗ trợ đối sánh biểu thức chính quy .

Vì vậy, ví dụ của bạn sẽ giống như

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

Điều này sẽ khớp với một tiêu đề bắt đầu bằng một hoặc nhiều chữ số và một khoảng trắng tùy chọn


6

Nếu bạn muốn tìm kiếm dưới dạng chuỗi, bạn có thể truyền sang văn bản như sau:

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

2

Tôi đến dự tiệc muộn ở đây, nhưng nếu bạn đang xử lý các số nguyên có độ dài cố định, bạn chỉ có thể thực hiện so sánh số nguyên:

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

2

Đã kiểm tra trên PostgreSQL 9.5:

- chỉ các chữ số

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

hoặc là,

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

- bắt đầu bằng chữ số

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

1

Giả sử rằng bạn đang tìm kiếm "các số bắt đầu bằng 7" thay vì "các chuỗi bắt đầu bằng 7", có thể giống như

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

Hoặc bất cứ điều gì tương đương với Postgres của chuyển đổi là.


0

Cái nào trong số đó có thể lập chỉ mục?

Cái này chắc chắn có thể lập chỉ mục btree:

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

Lưu ý rằng ':' đứng sau '9' trong ASCII.


0

Trong PostreSQL, bạn có thể sử dụng toán tử SIMILAR TO ( thêm ):

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

1
chỉ các chữ số: trong đó tiêu đề ~ '^ [0-9] * $';
Charlie 木匠

Có vẻ như SIMILAR TO không hoạt động với "^" trong PostgreSQL 9.5; POSIX Biểu thức chính quy "~" hoạt động.
Charlie 木匠
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.