OK, câu hỏi cột có điều kiện thứ mười một:Làm cách nào để có điều kiện lọc trên cột trong mệnh đề WHERE?
Tôi đang viết một tệp được lưu trữ có tham số đầu vào được ánh xạ tới một trong một số cột cờ. Cách tốt nhất để lọc cột được yêu cầu là gì? Tôi hiện đang trên SQL2000, nhưng về để di chuyển đến SQL2008, vì vậy tôi sẽ có một giải pháp đương đại nếu có sẵn.
Bảng truy vấn trong sproc trông giống như
ID ... fooFlag barFlag bazFlag quuxFlag
-- ------- ------- ------- --------
01 1 0 0 1
02 0 1 0 0
03 0 0 1 1
04 1 0 0 0
và tôi muốn làm một cái gì đó giống như
select ID, name, description, ...
from myTable
where (colname like @flag + 'Flag') = 1
vì vậy nếu tôi gọi sproc như exec uspMyProc @flag = 'foo'
Tôi muốn nhận lại hàng 1 và 4
Tôi biết tôi không thể thực hiện một phần trong việc chia sẻ trực tiếp trong SQL. Để thực hiện SQL động, tôi sẽ phải đặt toàn bộ truy vấn vào một chuỗi, nối chuỗi param @flag trong mệnh đề WHERE và sau đó thực thi chuỗi. Ngoài cảm giác bẩn thỉu mà tôi nhận được khi thực hiện SQL động, truy vấn của tôi khá lớn (tôi chọn một vài chục trường, tham gia 5 bảng, gọi một vài hàm), vì vậy nó là một chuỗi khổng lồ lớn vì một dòng duy nhất trong bộ lọc WHERE 3 dòng.
Cách khác, tôi có thể có 4 bản sao của truy vấn và chọn trong số chúng trong câu lệnh CASE. Điều này để lại mã SQL trực tiếp thực thi (và tùy thuộc vào cú pháp hilighting, vv) nhưng với chi phí lặp lại các khối lớn mã, vì tôi không thể sử dụng CASE chỉ với mệnh đề WHERE.
Có tùy chọn nào khác không? Bất kỳ tham gia khôn lanh hoặc hoạt động hợp lý có thể được áp dụng? Hoặc tôi nên vượt qua nó và thực hiện SQL động?
"exec uspMyProc @flag = 'foo' Tôi muốn quay lại hàng 1." Tại sao chỉ có hàng 1 và cũng không phải hàng 4? –
@Mark - d'oh, vâng, đã được sửa! – Val