2012-03-12 32 views
6

Vấn đề

Tôi đang sử dụng tên cột khác (bí danh) trong một truy vấn, tôi có thể sử dụng bí danh "GIVEN_NAME" như một phần của ORDER BY nhưng tôi không thể sử dụng nó như là một phần của mệnh đề WHERE. WHERE "given_name" được chuyển thành kết quả của một yêu cầu ngoài tầm kiểm soát của tôi và tôi không biết tên cột thực tế sẽ được sử dụng trong điều kiện WHERE.Cột Bí danh trong một mệnh đề where

Câu hỏi

  1. Nó có một chiều/hack để sử dụng một bí danh cột trong một mệnh đề WHERE?
  2. Có cách nào để tìm tên cột từ bí danh không?

Nghiên cứu

Sau khi một số nghiên cứu có vẻ như bí danh được bổ sung sau sau mệnh đề WHERE.

Ví dụ

SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
FROM green_profile profile 
LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 

Trả lời

4

chưa được kiểm tra, nhưng hack này nên làm việc ...

SELECT * FROM ( 
    SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
    FROM green_profile profile 
    LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
    LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1 
) as temptable 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 

Nó hoạt động bằng cách tạo một bảng tạm thời từ câu lệnh chọn ban đầu của bạn (không có mệnh đề where và order), nó có cột na mes bạn chỉ định. Sau đó bạn chọn từ này với các tên cột bạn muốn.

Một cách tiếp cận tốt hơn có thể là để tạo ra một cái nhìn, với các tên cột mà bạn muốn, và chọn từ màn hình ...

CREATE VIEW newtable AS 
SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
FROM green_profile profile 
LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1; 

Và sau đó ...

SELECT * FROM newtable 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 
+0

Cảm ơn, lời giải thích tuyệt vời. Cả hai giải pháp hoạt động tuy nhiên sau khi điểm chuẩn so với một bảng lớn, giải pháp xem cung cấp hiệu suất tốt hơn nhiều. –

+0

Tôi nghi ngờ rằng có thể như vậy, vì nó sẽ chỉ phải thực hiện lệnh chọn đầy đủ một lần cho chế độ xem, sau đó có thể cache và lập chỉ mục cho các cuộc gọi trong tương lai (không chắc chắn chi tiết của công việc này). Tôi hy vọng hiệu suất sẽ tốt hơn một chút chỉ đề cập đến các tên cột ban đầu, và không đối phó với quan điểm tất cả cùng nhau, nhưng hy vọng không phải là một sự khác biệt lớn. –

1

Trong nghi ngờ, chỉ cần tham khảo các cột theo số:

... 
ORDER BY 2 
... 
+0

Sẽ không tốt hơn nếu sử dụng tên đầy đủ là 'given.name'? thứ tự cột không thực sự là một cách tiếp cận mạnh mẽ –

+0

Điều này hoạt động tuy nhiên "given_name" đã được thông qua trong như là kết quả của yêu cầu khách hàng ngoài tầm kiểm soát của tôi. Tôi không có cách nào để xác định số cột hoặc "given_name" là bí danh cho given.name. –

3

Bạn có thể chỉ sử dụng bí danh cột trong các mệnh đề GROUP BY, ORDER BY hoặc HAVING.

SQL chuẩn không cho phép bạn tham chiếu đến bí danh cột trong mệnh đề WHERE. Hạn chế này được áp dụng vì khi mã WHERE được thực hiện, giá trị cột có thể chưa được xác định.