Nhận tất cả các ký tự trước khoảng trắng trong MySQL


81

Tôi muốn lấy tất cả các ký tự trong một trường trước một khoảng trắng

Ví dụ, nếu field1"chara ters"

Tôi muốn nó trở lại "chara"

Câu lệnh chọn này trông như thế nào?

Câu trả lời:


114

SELECT LEFT(field1,LOCATE(' ',field1) - 1)

Lưu ý rằng nếu chuỗi được đề cập không chứa khoảng trắng, điều này sẽ trả về một chuỗi trống.


6
Nó trả về 'chara' với dấu cách. Bạn cần giảm kết quả của LOCATE nếu cuối cùng không cần dấu phân tách: CHỌN TRÁI (field1, LOCATE ('', field1) - 1)
Enyby

1
Điều này sẽ không hoạt động nếu trường chính của bạn không chứa khoảng trắng. Chuỗi con sẽ trả về giá trị trống thay vì trả về toàn bộ chuỗi. Ví dụ: nếu trường của tôi chứa chuỗi con "test-can-sai-tên" sẽ không trả lại gì thay vì "tên thử nghiệm-có thể-sai-sai".
Swapnil Gangrade vào

2
@SwapnilGangrade Tùy thuộc vào trường hợp sử dụng thực tế có thể có hành vi mong đợi hay không. Người ta có thể tranh luận rằng nếu không có khoảng trắng trong chuỗi, thì không có ký tự nào trước khoảng trắng, và do đó, một chuỗi rỗng sẽ được trả về. Một người khác có thể muốn trả về toàn bộ chuỗi trong trường hợp đó. Câu hỏi không chỉ rõ hàm sẽ hoạt động như thế nào trong trường hợp cạnh này. Tôi sẽ cập nhật câu trả lời để làm nổi bật nó.
Mchl

11
Sau đó select SUBSTRING_INDEX( field1, ' ', 1 ) from table;sẽ là lựa chọn nếu chúng ta muốn có một chuỗi hoàn chỉnh nếu không có khoảng trắng.
Swapnil Gangrade vào

2
Câu trả lời dưới đây ( SUBSTRING_INDEX) là "tốt hơn" như một giải pháp chung vì nó sẽ giữ lại các giá trị không chứa dấu phân cách, thay vì dẫn đến một giá trị trống.
thoái hóa

88

Dưới đây là một phương pháp khác hoạt động và có vẻ đơn giản hơn một chút đối với một số người. Nó sử dụng hàm SUBSTRING_INDEX MySQL . A 1 trả về mọi thứ trước khoảng trắng đầu tiên và -1 trả về mọi thứ sau khoảng trắng cuối cùng.

Điều này trả về 'chara':

SELECT SUBSTRING_INDEX( field1, ' ', 1 )

Điều này trả về 'ters':

SELECT SUBSTRING_INDEX( field1, ' ', -1 )

Chi tiết

Giá trị dương sẽ tìm ký tự được chỉ định của bạn từ đầu chuỗi và giá trị âm sẽ bắt đầu từ cuối chuỗi. Giá trị của số cho biết số lượng ký tự được chỉ định của bạn cần tìm trước khi trả về đoạn còn lại của chuỗi. Nếu ký tự bạn đang tìm kiếm không tồn tại, toàn bộ giá trị trường sẽ được trả về.

Trong trường hợp này, một -2 sẽ trả về mọi thứ ở bên phải của khoảng trống thứ hai đến cuối cùng, không tồn tại trong ví dụ này, vì vậy toàn bộ giá trị trường sẽ được trả về.


3
Điều này cũng hoạt động, nếu có chuỗi, không có khoảng trống, ví dụ: 'chara' cũng sẽ hoạt động.
bernhardh

2
Điều này hoạt động hiệu quả trong việc nhận phiên bản chính + phụ của một chuỗi phiên bản với các thành phần xyz.
thomthom

4
Điều này hoạt động tốt nhất khi bạn muốn trả lại toàn bộ trường nếu không tìm thấy ký tự.
stephentgrammer

Tôi sử dụng điều này để trích xuất tọa độ địa lý từ một trường chuỗi có dấu phân cách (dấu phẩy) được phân cách để tồn tại.
ob-ivan

11

Bạn sẽ cần một số hoạt động chuỗi cho điều đó. Giả sử mọi trường đều có ít nhất một ký tự khoảng trắng:

SELECT SUBSTR(field1, 0, LOCATE(' ', field1)) FROM your_table;

Cách tiếp cận an toàn:

SELECT IF(
    LOCATE(' ', field1),
    SUBSTR(field1, 0, LOCATE(' ', field1)),
    field1
) FROM your_table;

+1 cho phiên bản an toàn, mặc dù không rõ kết quả nào sẽ được trả về khi trường không chứa ô trống.
Mchl

2
phải đổi 0 lấy 1:SELECT SUBSTR(field1, 1, LOCATE(' ', field1)) FROM your_table;
Lluís
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.