2014-06-17 13 views
10

Tôi muốn cắt một chuỗi thành một độ dài được chỉ định. Nếu chuỗi ngắn hơn, tôi không muốn làm gì cả. Tôi tìm thấy một hàm substr() thực hiện công việc. Tuy nhiên không có gì trong tài liệu Oracle những gì sẽ xảy ra nếu chuỗi ngắn hơn, chiều dài tối đa.Sử dụng chất nền để cắt chuỗi trên Oracle

Ví dụ này:

select substr('abc',1,5) from dual; 

lợi nhuận 'abc', đó là những gì tôi cần.

Tôi muốn hỏi xem điều này có an toàn không, vì chức năng dường như không được xác định cho việc sử dụng này. Có cách nào tốt hơn làm thế nào để cắt ngắn?

+1

'SUBSTR' luôn là tập hợp con của Chuỗi. Vì vậy, sẽ không bao giờ lớn hơn Chuỗi thực tế. –

Trả lời

5

Đây là một câu hỏi thú vị. Đáng ngạc nhiên, các documentation dường như không bao gồm điểm này một cách rõ ràng.

Tôi nghĩ rằng những gì bạn đang làm là khá an toàn. substr() sẽ không "thêm" ký tự vào cuối chuỗi khi chuỗi quá ngắn. Tôi đã phụ thuộc vào hành vi này trong nhiều cơ sở dữ liệu, bao gồm cả Oracle, theo thời gian. Đây là cách các chức năng tương tự hoạt động trong các cơ sở dữ liệu khác và hầu hết các ngôn ngữ.

Một loại ngoại lệ sẽ là khi loại dữ liệu gốc là char() thay vì loại varchar2(). Trong trường hợp này, hàm sẽ trả về một chuỗi cùng loại, vì vậy nó có thể được đệm bằng dấu cách. Mặc dù vậy, đó là thuộc tính của kiểu không thực sự của hàm.

12

Nó là hoàn toàn ok, nhưng nếu bạn muốn, bạn có thể sử dụng truy vấn này:

select substr('abc',1,least(5,length('abc'))) from dual; 
3

Nó là tốt hơn để sử dụng truy vấn dưới đây

SELECT SUBSTR('abc',1,LEAST(5,LENGTH('abc'))) FROM DUAL; 

Trên truy vấn hoặc là sẽ lấy chiều dài của chuỗi hoặc số 5 tùy theo mức nào thấp hơn.

+0

Tại sao nó tốt hơn? Bạn đang thực hiện thêm 2 chức năng ... – Ben

+0

Ý tôi là, để trở thành kẻ ngốc và phải yên tâm mà không có bất kỳ nghi ngờ nào! –

2

Nếu bạn muốn được hoàn toàn chắc chắn rằng bạn sẽ không kết thúc với dấu khoảng trống bằng cách sử dụng SUBSTR một mình (bạn sẽ không, nhưng đôi khi nó là an ủi được thực sự chắc chắn), bạn có thể sử dụng:

SELECT RTRIM(SUBSTR('abc',1,5)) FROM DUAL; 

Chia sẻ và tận hưởng.

Các vấn đề liên quan