Tôi có một bảng có các giá trị Boolean (chỉ 0 và 1) cần được chỉnh sửa CSV cho khách hàng. Tôi biết tôi có thể làm 1 thay thế như thế này
SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes') FROM myTable WHERE id > 1000;Thao tác này sẽ chuyển đổi tất cả các giá trị của 1 thành 'Có', nhưng làm cách nào để thực hiện việc này trong một truy vấn duy nhất cho cả 1 => Có và 0 => Không để kết quả Boolean được lưu trữ trong một cột?
SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000;Nhưng truy vấn này đã tạo một cột bổ sung để thay thế chuỗi 'Không' (vì vậy kết quả cuối cùng có 4 cột, email, tên, icon_clicked->yes, icon_clicked->no)
Giải pháp tốt nhất
Một cách là làm tổ REPLACE
SELECT REPLACE(REPLACE(icon_clicked, 0, 'No'), 1, 'Yes')), ... FROM myTable ...hoặc sử dụng CASE WHEN (điều này sẽ hoạt động với hầu hết các RDBMS so với hàm SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 0 có liên quan đến MySQL)
SELECT CASE WHEN icon_clicked THEN 'Yes' ELSE 'No' END, ... FROM myTable ...BIÊN TẬP
Ngoài ra còn có một cách tốt đẹp sử dụng
SELECT icon_clicked, ELT(FIELD(icon_clicked,0,1),'No','Yes'), ELT(icon_clicked + 1, 'No', 'Yes') FROM mytableGiải pháp liên quan
Sql – Chèn vào… giá trị ( CHỌN … TỪ … )
Thử
INSERT INTO table1 ( column1 ) SELECT col1 FROM table2Đây là ANSI SQL tiêu chuẩn và sẽ hoạt động trên mọi DBMS
Nó chắc chắn hoạt động cho
- tiên tri
- Máy chủ MS SQL
- mysql
- postgres
- SQLite v3
- siêu dữ liệu
- DB2
- Sybase
- Vertica
- HSQLDB
- H2
- AWS RedShift
- SAP HANA
- Google Spanner
Cách thay thế một ký tự bằng một dòng mới trong Vim
Sử dụng SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 4 thay vì SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 5
Thay thế bằng SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 5 sẽ chèn một ký tự null vào văn bản. Để có một dòng mới, hãy sử dụng SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 4. Tuy nhiên, khi tìm kiếm một dòng mới, bạn vẫn sử dụng SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 5. Sự bất đối xứng này là do SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 5 và SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 4 làm những việc hơi khác nhau
SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 5 khớp với cuối dòng (dòng mới), trong khi SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 4 khớp với dấu xuống dòng. Mặt khác, trong trường hợp thay thế SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 5 chèn một ký tự null trong khi SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 4 chèn một dòng mới (chính xác hơn, nó được coi là CR đầu vào). Đây là một ví dụ nhỏ, không tương tác để minh họa điều này, sử dụng tính năng dòng lệnh Vim (nói cách khác, bạn có thể sao chép và dán đoạn mã sau vào thiết bị đầu cuối để chạy nó). SELECT REPLACE(REPLACE(icon_clicked, 0, 'No'), 1, 'Yes')), ... FROM myTable ... 5 hiển thị kết xuất lục phân của tệp kết quả
echo bar > test (echo 'Before:'; xxd test) > output.txt vim test '+s/b/\n/' '+s/a/\r/' +wq (echo 'After:'; xxd test) >> output.txt more output.txt Before: 0000000: 6261 720a bar. After: 0000000: 000a 720a ..r.Nói cách khác, SELECT REPLACE(email, '%40', '@'), REPLACE(name,'%20', ' '), REPLACE(icon_clicked, 1, 'Yes'), REPLACE(icon_clicked, 0, 'No') FROM myTable WHERE id > 1000; 5 đã chèn byte 0x00 vào văn bản;