Khi sử dụng CASE
câu lệnh, tất cả các biểu thức kết quả phải có cùng kiểu dữ liệu. Nếu không, kết quả sẽ được chuyển đổi thành kiểu dữ liệu có mức độ ưu tiên cao hơn. Theo BOL
:
Kể từ INT
có ưu tiên loại dữ liệu
cao hơn hơn VARCHAR
, "Weeks"
được chuyển đổi thành INT
và điều đó tạo ra lỗi:
Một ví dụ khác sẽ tạo ra lỗi tương tự:
SELECT CASE WHEN 1 = 1 THEN 'True' ELSE 0 END
Giải pháp là chuyển đổi RS.intInterval
thành VARCHAR
:
CONVERT(VARCHAR(10), RS.intInterval)
Truy vấn cuối cùng của bạn phải là:
DECLARE @bFlag bit
SET @bFlag = 0
SELECT something = CASE
WHEN @bFlag = 1 THEN
CASE
WHEN RS.intInterval = 1 THEN '"Days"'
WHEN RS.intInterval = 2 THEN '"Weeks"'
WHEN RS.intInterval = 3 THEN '"Months"'
WHEN RS.intInterval = 4 THEN '"Years"'
END
Else
CONVERT(VARCHAR(10), RS.intInterval)
End
from MyTable AS RS WITH (NOLOCK)