2014-09-04 2 views
0

내 다음 코드에서 콘텐츠 검색을 동적으로 데이터베이스에 저장하려고합니다. 그러나 문제는 최종 조건입니다. 어떻게 변해야합니까?sql 'like'연산자를 어떻게 동적으로 변경합니까?

string qry= "SELECT Data_Sentences FROM table1 Where"; 
    For(i=0;i<arraylenth;i++) 
    { 
    qry+= " Data_sentences like '%" + array[i].tostring() + "%' OR"; 
    }qry += " 1=1"; 

이 코드의 최종 조건은 1 = 1이 잘못되었습니다. 모든 문장을 검색합니다. 예상 문장 만 얻으려면 어떻게 변경해야합니까?

+0

OR 문에서 OR 1 = 1을 수행했기 때문에 모든 것이 검색되는 이상한 점이 없으며 모든 것이 true이면 전체 문이 true이고 1 == 1이 항상 true이므로 아무리 전에, 당신의 전체 성명은 사실이 될 것입니다. – Pienterekaak

+0

@Pienterekaak 설명하기 위해 고맙습니다. 거기에 1 = 0을 더해야합니다. – Maduri

답변

0

그냥 1=0로 변경 :

string qry= "SELECT Data_Sentences FROM table1 Where"; 
For(i=0;i<arraylenth;i++) 
{ 
qry+= " Data_sentences like '%" + array[i].tostring() + "%' OR"; 
}qry += " 1=0"; 

사용 1=1를 커넥터가 AND 때.

+0

잘 작동합니다. 고맙습니다. 좋은 하루 보내세요 :). – Maduri

+0

@Maduri이 기능을 통해 원하는 기능을 제공 할 수는 있지만 이해가 부족하거나 코드에서 분명히 드러나는 다른 문제는 해결되지 않습니다. 나는 당신이 코드를 고치고 싶다면 (@JonK에 의해) 이것과 같은 시간에 좀 더 철저한 답을 제시 할 것이다. :) - 위의 코드는 여전히 컴파일되지 않습니다. –

0

재미있는 1 = 1 또는 1 = 더미 조건을 갖는 것이 더 합당한 경우.

string qry= "SELECT Data_Sentences FROM table1 Where"; 
For(i=0;i<arraylenth;i++) 
{ 
    qry+= " Data_sentences like '%" + array[i].tostring() + "%'"; 
    if (i < arraylenth-1) 
     qry+= " OR"; 
} 
+0

더미 조건의 포인트는 arrayLength가 0이면 SQL 쿼리가 유효하지 않은 상태가되지 않도록하기위한 것입니다. 할 일은 흔히있는 일이지만 대개 첫 번째 조건이며 끝까지 붙이지 않습니다. 또한 항상 WHERE 1 = 1 조건을 사용하면 전체 쿼리를 동적으로 작성하는 경우 WHERE 또는 AND가 필요한지 신경 쓸 필요가 없습니다. – JonK

+0

이런 젠장, 사람들이 왜 이렇게하는거야? 나는 이것을 때때로 보았고 결코 알지 못했다. 그것은 SQL을 엉망으로 만든 끔찍한 이유입니다. – nablex

+0

@nablex 동의합니다, 추한 것입니다. 그러나 전체 쿼리를 파싱하는 것보다 훨씬 쉽기 때문에 AND 또는 WHERE (둘 다 경험 했음)를 처리해야하는지 확인할 수 있습니다. 불행히도, 아니든, 나는 주 전체를 파스로 해석 할 수 있습니다. – JonK

1

게시 한 코드에 몇 가지 문제가 있습니다. 루프 내부

  • 원시 String 연결은 아주 나쁜 입니다. 대신 스레드 안전이 필요한 경우 StringBuilder (또는 StringBuffer)을 사용하십시오.
  • OR 1 = 1은 항상 true이므로 모든 단일 행이 조건을 충족하여 반환됩니다. 항상 어쨌든 추가되기 때문에

    StringBuilder qry = new StringBuilder(
         "SELECT Data_Sentences FROM table1 WHERE 1 = 1"); 
    for (int i = 0; i < array.length; i++) { 
        if (i == 0) { 
         qry.append(" AND (Data_sentences LIKE '%" + array[i].toString() + "%'"); 
        } else { 
         qry.append(" OR Data_sentences LIKE '%" + array[i].toString() + "%'"); 
        } 
    
        if (i == array.length - 1) { 
         qry.append(")"); 
        } 
    } 
    

    이 하나가 기본 문자열로 1 = 1 조건을 이동 :

당신에게 열려 몇 가지 옵션이 있습니다, 여기에 그들 중 일부입니다. 또한 (읽기 쉽도록 포맷)과 같은 쿼리를 생성하여 OR 조건의 형태를 변경 :

SELECT Data_Sentences 
    FROM table1 
WHERE 1 = 1 
    AND (Data_Sentences LIKE '%some value%' 
     OR Data_Sentences LIKE '%some other value%') 

분명히이 쿼리의 형식이 원래와는 다른, 그러나 같은 방식으로 작동합니다 . 또한, 당신이 할 수 있습니다 : (다시 읽기 쉽게 포맷) 현재 쿼리와 매우 비슷한 생산할 것

StringBuilder qry = new StringBuilder(
     "SELECT Data_Sentences FROM table1 WHERE"); 
for (int i = 0; i < array.length; i++) { 
    qry.append(" Data_sentences LIKE '%" + array[i].toString() + "%' OR"); 
} 
qry.append(" 1 = 0"); 

:

SELECT Data_Sentences 
    FROM table1 
WHERE Data_Sentences LIKE '%some value%' 
    OR Data_Sentences LIKE '%some other value%' 
    OR 1 = 0 

내가 볼 수있는 테스트를 수행하지 않은 어떤 쿼리가 더 효율적일 것입니다. 그러나 추측해야만한다면 더 적은 수의 OR이 포함 된 쿼리가 두 쿼리 중 빠를 것이지만 차이 (있는 경우)는 무시할 수 있습니다.

세 번째 옵션은 array 길이를 먼저 확인하고 0 인 경우 WHERE 절을 건너 뜁니다.

관련 문제