I have a query that I am writing in my C# code to retrieve results from database.
Based on the user input, my query will change.
I have a user input say 'challenge'. And 'challenge' can have three values 0,1 and 2, based on what user selects in UI.
If user selects challenge 0, the query will be different.
If user selects challenge 1, the query will be different.
And if user selects challenge 2, the query will be union of query for challenge 0 and query for challenge 1.
Below is how my code for generating sql query looks at present:
string sql = @"SELECT
tbl.given_id, name, message, tbl.emplid, category, created_date
FROM
dbo.myTable tbl
WHERE
created_date >= @dtFrom
AND created_date < @dtTo
";
//Include only challenge 0
if(challenge == 0)
{
sql += " AND emplid IN (" + sb.ToString() + ")"; //sb.ToString() is list of emplids selected from UI.
}
//Include only challenge 1
if (challenge == 1)
{
sql += " AND given_Id IN (SELECT DISTINCT rec.given_Id from dbo.Recipient rec WHERE rec.given_Id = tbl.given_Id AND rec.emplid IN (" + sb.ToString() + ")) ";
}
//Include both challenge 0 and 1
if (challenge == 2)
{
sql = String.Format(@"
SELECT * FROM
(
(
SELECT
tbl.given_id, name, message, tbl.emplid, category, created_date
FROM
dbo.myTable tbl
WHERE
created_date >= @dtFrom
AND created_date < @dtTo
AND tbl.emplid IN ({0})
)
UNION
(
SELECT
tbl.given_id, name, message, tbl.emplid, category, created_date
FROM
dbo.myTable tbl
WHERE
created_date >= @dtFrom
AND created_date < @dtTo
AND given_Id IN (SELECT DISTINCT rec.given_Id from dbo.Recipient rec WHERE rec.given_Id = tbl.given_Id AND rec.emplid IN (" + sb.ToString() + "))
)
)
", sb.ToString());
}
So, if(challenge == 2), is generating the query by the union of query generated in challenge = 0 and challenge = 1.
The query code in challenge = 2, is just repetitive of both the above queries.
Is there any other way of writing such query, so that I can improve my query and increase the perfomance?
Thanks.
Edit - Writing just the queries generated to simplify my question:
Query 1 -
SELECT
tbl.given_id, name, message, tbl.emplid, category, created_date
FROM
dbo.myTable tbl
WHERE
created_date >= @dtFrom
AND created_date < @dtTo
AND tbl.emplid IN (@lst_emplids)
Query 2
SELECT
tbl.given_id, name, message, tbl.emplid, category, created_date
FROM
dbo.myTable tbl
WHERE
created_date >= @dtFrom
AND created_date < @dtTo
AND given_Id IN (SELECT DISTINCT rec.given_Id from dbo.Recipient rec WHERE rec.given_Id = tbl.given_Id AND rec.emplid IN (@lst_emplids)
Query 3
SELECT * FROM
(
(
SELECT
tbl.given_id, name, message, tbl.emplid, category, created_date
FROM
dbo.myTable tbl
WHERE
created_date >= @dtFrom
AND created_date < @dtTo
AND tbl.emplid IN (@lst_emplids)
)
UNION
(
SELECT
tbl.given_id, name, message, tbl.emplid, category, created_date
FROM
dbo.myTable tbl
WHERE
created_date >= @dtFrom
AND created_date < @dtTo
AND given_Id IN (SELECT DISTINCT rec.given_Id from dbo.Recipient rec WHERE rec.given_Id = tbl.given_Id AND rec.emplid IN (@lst_emplids)
)
)
ToStringon aList<string>gives you"System.Collections.Generic.List`1[System.String]", that's not very useful in a SQL query. That's why I asked what type it was.