2010-08-26 35 views
35

Có thể kết hợp câu lệnh CASE và toán tử LIKE trong câu lệnh MySQL SELECT không? Ví dụ, tôi đang cố gắng truy vấn một cơ sở dữ liệu lưu trữ dữ liệu trong một cột ở một trong hai định dạng (điều này thật kinh khủng và làm đau đầu tôi, nhưng tôi không thể thay đổi dữ liệu để nó là gì). . Vì vậy, đôi khi cột numbers sẽ có dữ liệu như "6901xxxxxxxx" và đôi khi nó sẽ có dữ liệu như "91xxxxxxxxxxx".Trường hợp MySQL trong tuyên bố chọn với toán tử LIKE

Những gì tôi muốn làm là truy vấn dữ liệu như vậy -

SELECT 
    CASE digits 
     WHEN LIKE "6901%" THEN substr(digits,4) 
     WHEN LIKE "91%" THEN substr(digits,2) 
    END as "digits", 
FROM raw 

Điều này rõ ràng không hoạt động nhưng Im hy vọng có thể của nó.

Trả lời

68

Sử dụng hình thức thứ hai của CASE nên làm việc:

SELECT 
    CASE 
    WHEN digits LIKE '6901%' THEN substr(digits,4) 
    WHEN digits LIKE '91%' THEN substr(digits,2) 
    END as digits 
FROM raw 

Bên cạnh đó, bạn có một dấu phẩy đi lạc vào cuối SELECT của bạn.

+1

+1: 'TRƯỜNG HỢP cột WHEN ...' định dạng chỉ tốt cho các kết hợp chính xác; phải sử dụng định dạng này cho các kết quả khớp một phần. –

+2

Ding ding ding, dạng sai. Cảm ơn một chàng trai, bàn/trán của tôi rất biết ơn. – HurnsMobile

+0

Cảm ơn. Cú pháp là chính xác –

6

Hãy thử

SELECT 
    CASE true 
     WHEN digits LIKE "6901%" THEN substr(digits,4) 
     WHEN digits LIKE "91%" THEN substr(digits,2) 
    END as "digits", 
FROM raw 
+1

+1: Tôi đã thử nghiệm, tính năng này hoạt động. MySQL bỏ qua "true"; Tôi nghĩ rằng nó sẽ kích hoạt một lỗi cú pháp. Tuy nhiên, tôi sẽ không thêm "đúng" trong đó nếu nó không cần thiết. –

+0

+1 để làm việc, không hoàn toàn cũng như câu trả lời được trả lời :) – HurnsMobile

4

Có thể sử dụng LEFT()?

SELECT 
    CASE 
     WHEN LEFT(digits, 4) = '6901' THEN substr(digits,4) 
     WHEN LEFT(digits, 2) = '91' THEN substr(digits,2) 
    END 
FROM raw 

Phải có hiệu suất cao hơn LIKE.

+0

Các LIKE trong ví dụ này chỉ là wildcarding phía bên phải, vì vậy một chỉ số có thể được sử dụng nhưng tôi không tin rằng LEFT/INSTR có thể sử dụng một chỉ mục. +1 để thay thế. –

0

Giả sử các số chữ số là không đổi, bạn có thể sử dụng một cái gì đó như thế này:

SELECT IF(digits > 919999, MOD(digits, 100), MOD(digits, 10000) FROM raw 

Thêm 0 's để phù hợp với con số thực tế lại chữ số.

Các vấn đề liên quan