좀 짓고 있어요 SQL의 C #에서 쿼리를. 코드에 변수로 저장된 일부 조건에 따라 달라집니다.
string Query="SELECT * FROM Table1 WHERE 1=1 ";
if (condition1)
Query += "AND Col1=0 ";
if (condition2)
Query += "AND Col2=1 ";
if (condition3)
Query += "AND Col3=2 ";
작동하지만 1 = 1 테스트는 우아하게 보이지 않습니다. 사용하지 않았다면 쿼리에 “where”키워드가 이미 추가되었는지 여부를 매번 기억하고 확인해야했습니다.
더 좋은 해결책이 있습니까?
답변
목록에 조건을 저장합니다.
List<string> conditions = new List<string>();
if (condition1) conditions.Add("Col1=0");
//...
if (conditions.Any())
Query += " WHERE " + string.Join(" AND ", conditions.ToArray());
답변
한 가지 해결책은 단순히 문자열을 추가하여 수동으로 쿼리를 작성하지 않는 것입니다. Entity Framework 와 같은 ORM을 사용할 수 있으며 LINQ to Entities에서는 언어 및 프레임 워크가 제공하는 기능을 사용할 수 있습니다.
using (var dbContext = new MyDbContext())
{
IQueryable<Table1Item> query = dbContext.Table1;
if (condition1)
{
query = query.Where(c => c.Col1 == 0);
}
if (condition2)
{
query = query.Where(c => c.Col2 == 1);
}
if (condition3)
{
query = query.Where(c => c.Col3 == 2);
}
PrintResults(query);
}
답변
이 간단한 경우에는 약간의 과잉이 있지만 과거에 이와 유사한 코드를 사용했습니다.
함수 만들기
string AddCondition(string clause, string appender, string condition)
{
if (clause.Length <= 0)
{
return String.Format("WHERE {0}",condition);
}
return string.Format("{0} {1} {2}", clause, appender, condition);
}
이렇게 사용하세요
string query = "SELECT * FROM Table1 {0}";
string whereClause = string.Empty;
if (condition 1)
whereClause = AddCondition(whereClause, "AND", "Col=1");
if (condition 2)
whereClause = AddCondition(whereClause, "AND", "Col2=2");
string finalQuery = String.Format(query, whereClause);
이렇게하면 조건이 발견되지 않으면 쿼리에서 where 문을로드하지 않아도되며 SQL 문을 구문 분석 할 때 정크 where 절을 처리하는 데 마이크로 초를 절약 할 수 있습니다.
답변
우아하지 않을 수도 있지만 작동하고 문제를 해결하는 또 다른 솔루션이 있습니다.
String query = "SELECT * FROM Table1";
List<string> conditions = new List<string>();
// ... fill the conditions
string joiner = " WHERE ";
foreach (string condition in conditions) {
query += joiner + condition;
joiner = " AND "
}
에 대한:
- 빈 조건 목록, 결과는 단순히
SELECT * FROM Table1
, - 하나의 조건이 될 것입니다
SELECT * FROM Table1 WHERE cond1
- 다음의 각 조건은 추가로
AND condN
답변
다음과 같이하십시오.
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT * FROM Table1";
var conditions = "";
if (condition1)
{
conditions += "Col1=@val1 AND ";
command.AddParameter("val1", 1);
}
if (condition2)
{
conditions += "Col2=@val2 AND ";
command.AddParameter("val2", 1);
}
if (condition3)
{
conditions += "Col3=@val3 AND ";
command.AddParameter("val3", 1);
}
if (conditions != "")
command.CommandText += " WHERE " + conditions.Remove(conditions.Length - 5);
}
그것의 SQL 주입 안전 및 이럴 , 그것은 꽤 깨끗. 는 Remove()
단순히 마지막을 제거AND
;
조건이 설정되지 않았거나 하나가 설정되었거나 여러 개가 설정된 경우 모두 작동합니다.
답변
뒤에 두 줄만 추가하면됩니다.
string Query="SELECT * FROM Table1 WHERE 1=1 ";
if (condition1) Query+="AND Col1=0 ";
if (condition2) Query+="AND Col2=1 ";
if (condition3) Query+="AND Col3=2 ";
Query.Replace("1=1 AND ", "");
Query.Replace(" WHERE 1=1 ", "");
예
SELECT * FROM Table1 WHERE 1=1 AND Col1=0 AND Col2=1 AND Col3=2
될 것이다
SELECT * FROM Table1 WHERE Col1=0 AND Col2=1 AND Col3=2
동안
SELECT * FROM Table1 WHERE 1=1
될 것이다
SELECT * FROM Table1
====================================
이 솔루션의 결함을 지적 해 주셔서 감사합니다.
“어떤 이유에서든 조건 중 하나에”1 = 1 AND “또는”WHERE 1 = 1 “이라는 텍스트가 포함 된 경우 쿼리가 중단 될 수 있습니다. 조건에 하위 쿼리가 포함되어 있는지 확인하려는 경우 일 수 있습니다. 예를 들어 열에이 텍스트가 포함되어 있습니다.이 문제는 귀하의 경우에는 문제가되지 않지만 명심해야합니다. “
이 문제를 없애기 위해 “main” WHERE 1 = 1 과 하위 쿼리의 항목 을 구분해야합니다 . 간단합니다.
간단하게 만드는 “기본” WHERE 특별 : 나는 “$”기호를 추가 할
string Query="SELECT * FROM Table1 WHERE$ 1=1 ";
if (condition1) Query+="AND Col1=0 ";
if (condition2) Query+="AND Col2=1 ";
if (condition3) Query+="AND Col3=2 ";
그런 다음 두 줄을 추가합니다.
Query.Replace("WHERE$ 1=1 AND ", "WHERE ");
Query.Replace(" WHERE$ 1=1 ", "");
답변
이것을 사용하십시오 :
string Query="SELECT * FROM Table1 WHERE ";
string QuerySub;
if (condition1) QuerySub+="AND Col1=0 ";
if (condition2) QuerySub+="AND Col2=1 ";
if (condition3) QuerySub+="AND Col3=2 ";
if (QuerySub.StartsWith("AND"))
QuerySub = QuerySub.TrimStart("AND".ToCharArray());
Query = Query + QuerySub;
if (Query.EndsWith("WHERE "))
Query = Query.TrimEnd("WHERE ".ToCharArray());