Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

CASE in WHERE CLAUSE trong MYSQL

Bạn đang đi đúng hướng với lần thử thứ hai, sử dụng AND/OR logic các nhóm thay vì CASE , nhưng nếu bạn muốn thích hàng khớp với cmp_brand trên các hàng có cmp_brand trống và chỉ mong đợi một kết quả trả về, hãy cấu trúc ORDER BY của bạn để sắp xếp cmp_brand không trống đầu tiên và giới hạn kết quả tổng thể là 1.

SELECT thumb 
FROM inf_brand_images 
WHERE
  is_active=1 AND 
  ((cmp_brand = '' AND brand='NIKE') OR (cmp_brand='123_NIKE'))
/* non-empty cmp_brand will sort first */
ORDER BY cmp_brand <> '' DESC
/* and the end result is limited only to the first sorted row
   which will be the cmp_brand if matched, or the brand otherwise */
LIMIT 1

http://sqlfiddle.com/#!2/d176b/2

Điều này hoạt động vì biểu thức cmp_brand <> '' đánh giá thành boolean true/false , MySQL hiểu là 1/0 . Sắp xếp giảm dần trên các giá trị đó buộc các giá trị không trống phải sắp xếp thành nắm đấm (1 trước 0).

Cập nhật sau nhận xét:

Vì bạn có khả năng trả về nhiều hơn một hàng, bạn không thể dựa vào ORDER BY . Thay vào đó, bạn có thể thực hiện LEFT JOIN so với cùng một bảng. Ở một bên, khớp với cmp_brand = '' và ở phía bên kia khớp với cmp_brand = '123_NIKE' . Quan trọng, hãy trả lại thumb cột từ cả hai các mặt của sự tham gia.

Kết thúc điều đó trong một truy vấn con trong FROM , thì ở cấp cao nhất, bạn có thể sử dụng SELECT CASE thích cmp_brand nếu không có gì.

SELECT DISTINCT
  CASE WHEN cbcb IS NOT NULL THEN cbthumb ELSE bthumb END AS thumb
FROM (
  /* Return thumbs from both sides of the join */
  SELECT 
    b.thumb AS bthumb,
    b.cmp_brand AS bcb,
    cb.thumb AS cbthumb,
    cb.cmp_brand AS cbcb
  FROM
    inf_brand_images b
    /* join the table against itself with the matching cmp_brand in the join condition */
    LEFT JOIN inf_brand_images cb
      ON b.brand = cb.brand
      AND cb.cmp_brand = '123_NIKE'
  WHERE 
    /* The WHERE clause looks for empty cmp_brand on the left side of the join */
    b.brand = 'NIKE' AND b.cmp_brand = ''
) thumbs



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thuộc tính đa hình Để trong nhiều đến nhiều ánh xạ trong grails?

  2. Câu lệnh MYSQL SELECT TRONG VÒNG IF

  3. CHỌN INTO Biến trong MySQL DECLARE gây ra lỗi cú pháp?

  4. Nối các bảng khác nhau dựa trên giá trị cột

  5. Cách áp dụng phân trang cho kết quả của truy vấn SHOW TABLES trong PHP