I have a pre-existing query that I am modifying. The resultant data is pushed directly into a DataGridView object as a DataSet. There are multiple bit fields which result in checkboxes in the datagridview element. I want to mimic this functionality, but I need to use a Coalesce on my particular field. SQL is listed below:
SELECT res_id
, res_resolution [Resolution]
, res_type [Res. Type]
, res_is_refund [Refund]
, res_ship_replacement_today [Ship Today]
, res_ship_replacement_after_return [Ship After Return]
, res_return_required [Ret. Req.]
, res_test [Test]
, res_menu_divider [Menu Div.]
, res_orderby [Menu Order]
, res_new_return [New Returns]
, res_process_return [Receive Returns]
, res_modified [Last Updated]
, res_active [Active]
, COALESCE(rra_is_mispull_error, 0) [Mispull]
FROM jfi_return_resolution
LEFT JOIN jfi_return_resolution_attribute rra ON rra.rra_res_id = res_id
ORDER BY res_orderby;
The result of the above query is functionally correct, but the coalesce appears as a 1 or a 0. Since this is client facing, I need to make this a checkbox. Other fields (such as res_is_refund) appear in the DataGridView properly as a checkbox.
I've attempted to change the coalesce function to COALESCE(rra_is_mispull_error,false) [Mispull]
but that just crashes the application. Removing the COALESCE all together would result in a bunch of nulls which would be as bad as 1's and 0's.
The C# that transfers the data into the DataGridView is in this form (as pseudocode because it isn't in a form which would easily be transferable to a forum post)
SqlDataAdapter SDA = new SqlDataAdapter();
DataSet ds = new DataSet();
Using(SqlConnection Conn ...)
{
conn.Open();
using(SqlCommand cmd = new SqlCommand(sql,conn))
{
SDA.SelectCommand = cmd;
SDA.Fill(ds);
}
}
MyDGV.DataSource = ds.Tables[0].DefaultView;
You can presume that the C# code and SQL actually functions properly outside of the Coalesce issue.
答案 0 :(得分:2)
If your column in the database is a BIT, You have to CAST the 0 to bit, like this:
COALESCE(rra_is_mispull_error, CAST(0 AS bit))
otherwise the result is interpreted as an INT on the moment the column is created in the Dataset.
If your column in the database is an INT then you have to cast the entire result of the COALESCE:
CAST(COALESCE(rra_is_mispull_error, 0) AS bit)
答案 1 :(得分:1)
This should do the trick:
SELECT res_id
, res_resolution [Resolution]
, res_type [Res. Type]
, res_is_refund [Refund]
, res_ship_replacement_today [Ship Today]
, res_ship_replacement_after_return [Ship After Return]
, res_return_required [Ret. Req.]
, res_test [Test]
, res_menu_divider [Menu Div.]
, res_orderby [Menu Order]
, res_new_return [New Returns]
, res_process_return [Receive Returns]
, res_modified [Last Updated]
, res_active [Active]
, CASE
WHEN ISNULL(rra_is_mispull_error, 0) = 0 THEN 'false'
ELSE 'true'
END AS [Mispull]
FROM jfi_return_resolution
LEFT JOIN jfi_return_resolution_attribute rra ON rra.rra_res_id = res_id
ORDER BY res_orderby;
if your data in column rra_is_mispull_error
is of the type INT
and you only have the following range [0-1] then you can do this:
SELECT res_id
, res_resolution [Resolution]
, res_type [Res. Type]
, res_is_refund [Refund]
, res_ship_replacement_today [Ship Today]
, res_ship_replacement_after_return [Ship After Return]
, res_return_required [Ret. Req.]
, res_test [Test]
, res_menu_divider [Menu Div.]
, res_orderby [Menu Order]
, res_new_return [New Returns]
, res_process_return [Receive Returns]
, res_modified [Last Updated]
, res_active [Active]
, CAST(ISNULL(rra_is_mispull_error, 0) AS BIT) AS [Mispull]
FROM jfi_return_resolution
LEFT JOIN jfi_return_resolution_attribute rra ON rra.rra_res_id = res_id
ORDER BY res_orderby;