2011-03-13 98 views
9

Trong bảng của tôi, tôi có trường "firstname" và trường "lastname". Tôi muốn chọn tất cả các bản ghi trong đó firstname + space + lastname là một giá trị nhất định.Kết hợp hai trường trong câu lệnh SELECT

Tôi đã thử điều này:

$sql = "SELECT * FROM sam_users WHERE (user_firstname + ' ' + user_lastname LIKE ?)"; 

Nhưng điều này không hoạt động. Với Google tôi đã tìm thấy một cái gì đó về việc sử dụng ||, nhưng tôi không thực sự hiểu làm thế nào tôi nên sử dụng toán tử đó. Lưu ý rằng tôi không muốn sử dụng một toán tử (cái gì || là nhiều ngôn ngữ), nhưng một cái gì đó để nối 2 trường (với khoảng cách giữa chúng) và sử dụng LIKE trên đó.

Cảm ơn!

+4

RDBMS là gì? Và tại sao bạn sử dụng 'LIKE' thay vì' = '? –

+0

MySQL, nhưng tôi đang sử dụng thư viện PDO (PHP) nên nó phải di động. Tôi đang sử dụng LIKE bởi vì tôi đang tạo một trường "tìm kiếm", do đó kết quả phải là danh sách tất cả người dùng có tên giống như chuỗi đã nhập. – Bv202

+0

@ Bv202 - Không chắc chắn có phương pháp ghép chuỗi "di động nhất" hay không. Sẽ được quan tâm bản thân mình nếu có câu trả lời bao gồm điều đó. –

Trả lời

22

Với MySQL, bạn có thể sử dụng CONCAT:

SELECT * FROM sam_users 
    WHERE CONCAT(user_firstname, ' ', user_lastname) LIKE ? 

hoặc CONCAT_WS (mà bỏ qua các giá trị NULL):

SELECT * FROM sam_users 
    WHERE CONCAT_WS(' ', user_firstname, user_lastname) LIKE ? 

Tuy nhiên, MySQL sẽ không thể sử dụng bất kỳ indices khi thực hiện truy vấn này. Nếu giá trị của đối số mẫu thành LIKE bắt đầu bằng ký tự đại diện, MySQL sẽ không thể sử dụng chỉ mục, do đó so sánh với giá trị được tạo (thay vì cột) sẽ không tạo sự khác biệt.

Bạn cũng có thể đặt MySQL server SQL mode thành "ANSI" hoặc "PIPES_AS_CONCAT" để sử dụng toán tử || cho nối chuỗi.

SET @@sql_mode=CONCAT_WS(',', @@sql_mode, 'PIPES_AS_CONCAT'); 
SELECT * FROM sam_users 
    WHERE (user_firstname || ' ' || user_lastname) LIKE ? 

Chế độ này chỉ đặt chế độ SQL cho hiện tại session. Bạn sẽ cần đặt @@sql_mode mỗi khi bạn kết nối. Nếu bạn muốn unset 'PIPES_AS_CONCAT' chế độ trong một phiên:

SET @@sql_mode=REPLACE(@@sql_mode, 'PIPES_AS_CONCAT', ''); 

MySQL xuất hiện để loại bỏ bất kỳ dấu phẩy thêm trong @@sql_mode, do đó bạn không cần phải lo lắng về chúng.

Không sử dụng SELECT *; chỉ chọn các cột bạn cần.

+0

Ồ, cách quá dễ dàng ... bằng cách nào đó tôi phải bỏ lỡ từ khóa CONCAT ... Cảm ơn bạn đã liên kết về SELECT *; điều đó thật thú vị :) – Bv202

+0

Điều gì về việc sử dụng tính (*)? Đó cũng là một điều xấu? – Bv202

+1

@ Bv202: Không hề. 'COUNT (*)' là một trường hợp đặc biệt. Các cột chính họ không được kiểm tra cho kiểm đếm (mặc dù họ sẽ cho bất kỳ điều khoản khác), chỉ cần các hàng phù hợp. Ngay cả khi không có tối ưu hóa này, việc thay đổi định nghĩa bảng sẽ không ảnh hưởng đến 'COUNT (*)' theo cách có thể gây ra sự cố. – outis

1
SELECT * 
FROM sam_users 
WHERE TRIM(Concat(user_firstname, ' ', user_lastname)) LIKE ?; 
2

Trong SQL toán tử ||thực hiện nối kết chuỗi có nghĩa là trung bình theo tiêu chuẩn (xem SQL 2008: 5.2). Toán tử boolean hoặc toán tử được viết OR trong SQL.

Tuy nhiên không phải tất cả cơ sở dữ liệu đều triển khai theo cách này và do đó cú pháp chính xác tùy thuộc vào cơ sở dữ liệu cụ thể.

  • Máy chủ MySQL sử dụng chức năng CONCAT.
  • Máy chủ MSSQL sử dụng toán tử +.
Các vấn đề liên quan