MySQL chọn với điều kiện CONCAT


116

Tôi đang cố gắng biên dịch điều này trong tâm trí của mình .. tôi có một bảng với các trường tên và họ và tôi có một chuỗi như "Bob Jones" hoặc "Bob Michael Jones" và một số người khác.

vấn đề là, tôi có ví dụ Bob trong tên đầu tiên và Michael Jones trong tên cuối cùng

vì vậy tôi đang cố gắng

SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users 
 WHERE firstlast = "Bob Michael Jones"

nhưng nó nói cột không xác định "Firstlast" .. bất cứ ai có thể giúp đỡ?

Câu trả lời:


177

Các bí danh bạn đưa ra là cho đầu ra của truy vấn - chúng không có sẵn trong chính truy vấn đó.

Bạn có thể lặp lại biểu thức:

SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
FROM users
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"

hoặc bọc truy vấn

SELECT * FROM (
  SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users) base 
WHERE firstLast = "Bob Michael Jones"

5
đây là để đặt câu trả lời.
Arun Killu

sau một thời gian, tôi có thể nói rằng tôi đồng ý sử dụng nó như một câu trả lời tốt hơn
Alex K

@Alex bạn có thể chọn một câu trả lời khác nếu bạn muốn làm như vậy
gypaetus

1
Đối với một bảng cồng kềnh có nhiều hàng, tôi nghĩ sẽ không khôn ngoan khi sử dụng phiên bản "bọc truy vấn".
Fandi Susanto

34

Thử cái này:

SELECT * 
  FROM  (
        SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
        FROM users 
    ) a
WHERE firstlast = "Bob Michael Jones"

hoạt động hoàn hảo đối với tôi, cảm ơn rất nhiều :) và cảm ơn vì đã đặt văn bản vào mã, tôi đã quên
Alex K

10
SELECT needefield, CONCAT(firstname, ' ',lastname) as firstlast 
FROM users 
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"

8

Sử dụng CONCAT_WS ().

SELECT CONCAT_WS(' ',firstname,lastname) as firstlast FROM users 
WHERE firstlast = "Bob Michael Jones";

Đối số đầu tiên là dấu phân cách cho phần còn lại của các đối số.


vì vậy nó sẽ làCONCAT_WS(' ', ..
Alex K

7

Thử:

SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users 
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"

Bí danh đầu tiên của bạn không có sẵn trong mệnh đề where của truy vấn trừ khi bạn thực hiện truy vấn dưới dạng chọn phụ.


7

Có một cách khác để lặp lại CONCATbiểu thức hoặc sử dụng các truy vấn con. Bạn có thể sử dụng HAVINGmệnh đề, trong đó nhận ra các bí danh cột.

SELECT 
  neededfield, CONCAT(firstname, ' ', lastname) AS firstlast 
FROM
  users 
HAVING firstlast = "Bob Michael Jones"

Đây là một Fiddle SQL hoạt động .


Không chắc chắn tại sao mệnh đề có không được chú ý nhiều hơn. Nó cho phép sử dụng trực tiếp tên cột ảo. Có điều khoản có nhiều chi phí không?
Paul

@Paul có mệnh đề được áp dụng khi kết thúc truy vấn để chúng ta có thể sử dụng nó để đặt điều kiện cho các hàm tổng hợp (như MAX ()). Có mệnh đề không thể sử dụng chỉ mục nên nó chậm.
Mostafa Vatanpour
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.