[c#] 처음에 1 = 1을 사용하는 것보다 SQL WHERE 절을 동적으로 빌드하는 더 좋은 방법이 있습니까?

좀 짓고 있어요 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());