Bỏ hai ký tự cuối cùng của một cột trong MySQL


80

Tôi có một cột SQL nơi các mục nhập là chuỗi. Tôi cần hiển thị các mục nhập đó sau khi cắt bớt hai ký tự cuối cùng, ví dụ: nếu mục nhập là 199902345nó sẽ xuất ra 1999023.

Tôi đã thử xem xét TRIM nhưng có vẻ như nó chỉ cho phép cắt bớt nếu chúng ta biết đâu là hai ký tự cuối cùng. Nhưng trong trường hợp của tôi, tôi không biết hai số cuối đó là gì và chỉ cần bỏ chúng đi.

Vậy, tóm lại, thao tác chuỗi MySQL nào cho phép cắt bỏ hai ký tự cuối cùng của một chuỗi?

Tôi phải nói thêm rằng độ dài của chuỗi không cố định. Nó có thể là 9 ký tự, 11 ký tự hoặc bất kỳ ký tự nào.


Kiểu dữ liệu của cột là gì? INT hoặc VARCHAR. INT sẽ cho phép tính toán nhanh hơn.
Salman A

@Salman VARCHAR của nó (vì chúng tôi cũng có Chars trong việc triển khai)
Lucky Murari,

1
OK sau đó SUBSTRINGcó vẻ thích hợp. Đối với kiểu dữ liệu INT, nó dễ dàng như chia cho 100.
Salman A

Câu trả lời:


120

Để chọn tất cả các ký tự ngoại trừ n cuối cùng từ một chuỗi (hoặc nói một cách khác, xóa n ký tự cuối cùng khỏi một chuỗi); sử dụng các chức năng SUBSTRINGCHAR_LENGTHcùng nhau:

SELECT col
     , /* ANSI Syntax  */ SUBSTRING(col FROM 1 FOR CHAR_LENGTH(col) - 2) AS col_trimmed
     , /* MySQL Syntax */ SUBSTRING(col,     1,    CHAR_LENGTH(col) - 2) AS col_trimmed
FROM tbl

Để xóa một chuỗi con cụ thể khỏi phần cuối của chuỗi, hãy sử dụng TRIMhàm:

SELECT col
     , TRIM(TRAILING '.php' FROM col)
-- index.php becomes index
-- index.txt remains index.txt

1
Giải pháp này rất hay. Nhưng nó yêu cầu phải có quyền truy cập trực tiếp vào cột. Nếu cột là kết quả của một số Stringmanipulation khác, có thể sử dụng cột này để thay thế: REVERSE (SUBSTR (REVERSE ("some_string")), 2))
Charliexyx,

74

Tại sao không sử dụng hàm LEFT (chuỗi, độ dài) thay vì chuỗi con.

LEFT(col,length(col)-2) 

bạn có thể truy cập vào đây https://dev.mysql.com/doc/refman/5.7/en/string-functions.html# Chức năng_left để biết thêm về Mysql String Functions.


1
Mặc dù câu trả lời được chấp nhận là đúng, tôi thích câu trả lời này hơn. Tôi đã đọc một số cuộc thảo luận về việc LEFT () hoạt động tốt hơn một chút so với SUBSTRING () nhưng tôi không thể tìm thấy liên kết ngay bây giờ. Sẽ thật tuyệt nếu bạn có thể thêm liên kết đến tài liệu mysql cho hàm LEFT.
anuragw

1
Giải pháp tốt hơn nhiều so với SUBSTRING ()
Matthias Kleine

Nếu sự khác biệt nằm , 1trong lời gọi hàm, tôi nghĩ rằng có một hàm hoàn toàn mới để làm điều đó chỉ là ô nhiễm không gian tên. RIGHThữu ích hơn một chút ở chỗ nó có thể giúp bạn tiết kiệm từ LENGTH()tính toán nhưng vẫn còn, bất kỳ mức tăng hiệu suất nào giữa hai điều này có thể ít hơn nhiều so với chi phí gọi LENGTH()riêng. Một hoặc hai thao tác thêm cho mỗi cuộc gọi là sự khác biệt duy nhất giữa LEFT RIGHTSUBSTRING. Trong SQL performance 2 native add chẳng là gì cả.
ebyrob

Tôi đã phải sử dụng CHAR_LENGTH thay vì LENGTH nhưng giải pháp này hoạt động tốt.
Anthony Taylor


0

Bạn có thể sử dụng một LENGTH(that_string)dấu trừ number of charactersmà bạn muốn loại bỏ trong SUBSTRING()lựa chọn có lẽ hoặc sử dụng TRIM()chức năng.


1
Nếu bạn có thể hiển thị một ví dụ về cách TRIM()làm việc cho tất cả các ký tự theo chỉ mục thay vì loại bỏ tất cả một loại ký tự nhất định, tôi muốn xem nó.
ebyrob 21/1217
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.