programing

SQL 동일한 필드에서 여러 값 검색

oldcodes 2023. 7. 23. 14:40
반응형

SQL 동일한 필드에서 여러 값 검색

간단한 검색 알고리즘을 만들고 있으며 공백으로 문자열을 구분하고 데이터베이스를 검색합니다.

$search = "Sony TV with FullHD support";  
$search = explode( ' ', $search );

SELECT name FROM Products WHERE name LIKE %$search[1]% AND name LIKE %$search[2]% LIMIT 6

이것이 가능합니까?

예, SQL을 사용할 수 있습니다.IN연산자를 사용하여 여러 개의 절대값을 검색합니다.

SELECT name FROM products WHERE name IN ( 'Value1', 'Value2', ... );

사용할 경우LIKE다음을 사용해야 합니다.OR대신:

SELECT name FROM products WHERE name LIKE '%Value1' OR name LIKE '%Value2';

사용.AND(시도한 대로) 모든 조건이 참이어야 합니다.OR하나 이상의 참이 필요합니다.

사용해 보세요.

사용.UNION

$sql = '';
$count = 0;
foreach($search as $text)
{
  if($count > 0)
     $sql = $sql."UNION Select name From myTable WHERE Name LIKE '%$text%'";
  else
     $sql = $sql."Select name From myTable WHERE Name LIKE '%$text%'";

  $count++;
}

사용.WHERE IN

$comma_separated = "('" . implode("','", $search) . "')";  // ('1','2','3')
$sql = "Select name From myTable WHERE name IN ".$comma_separated ;

이것은 하나 또는 여러 필드가 여러 단어를 검색하는 두 경우 모두에서 완벽하게 작동합니다.

이것이 누군가에게 도움이 되기를 바랍니다.감사해요.

declare @searchTrm varchar(MAX)='one two three four'; 
--select value from STRING_SPLIT(@searchTrm, ' ') where trim(value)<>''
select * from Bols 
WHERE EXISTS (SELECT value  
    FROM STRING_SPLIT(@searchTrm, ' ')  
    WHERE 
        trim(value)<>''
        and(    
        BolNumber like '%'+ value+'%'
        or UserComment like '%'+ value+'%'
        or RequesterId like '%'+ value+'%' )
        )

아래 쿼리를 실행할 수 있습니다.

SELECT name FROM Products WHERE REGEXP '.*Value1|.*Value2'; 

파이프 기호(|) 앞이나 뒤에는 공백이 없어야 합니다.

이것은 여기서 부분적으로 답변되었습니다: MySQL 여러 값을 좋아합니다.

을 반대합니다

$search = 폭발( ', $search );

SQL 쿼리에 직접 입력하면 검색 표시줄을 통해 SQL 주입이 쉬워집니다.캐릭터들이 다음과 같은 재미있는 시도를 할 경우를 대비해 먼저 탈출해야 합니다: "--; Drop TABLE name;

$search = str_replace(")", "", search );

하지만 그것조차도 완전히 안전한 것은 아닙니다.안전하려면 SQL 준비 문을 사용해야 합니다.정규식을 사용하면 원하는 것을 준비하고 만드는 기능을 훨씬 쉽게 만들 수 있습니다.

function makeSQL_search_pattern($search) {
    search_pattern = false;
    //escape the special regex chars
    $search = str_replace('"', "''", $search);
    $search = str_replace('^', "\\^", $search);
    $search = str_replace('$', "\\$", $search);
    $search = str_replace('.', "\\.", $search);
    $search = str_replace('[', "\\[", $search);
    $search = str_replace(']', "\\]", $search);
    $search = str_replace('|', "\\|", $search);
    $search = str_replace('*', "\\*", $search);
    $search = str_replace('+', "\\+", $search);
    $search = str_replace('{', "\\{", $search);
    $search = str_replace('}', "\\}", $search);
    $search = explode(" ", $search);
    for ($i = 0; $i < count($search); $i++) {
        if ($i > 0 && $i < count($search) ) {
           $search_pattern .= "|";
        }
        $search_pattern .= $search[$i];
    }
    return search_pattern;
}

$search_pattern = makeSQL_search_pattern($search);
$sql_query = "SELECT name FROM Products WHERE name REGEXP :search LIMIT 6"
$stmt = pdo->prepare($sql_query);
$stmt->bindParam(":search", $search_pattern, PDO::PARAM_STR);
$stmt->execute();

저는 이 코드를 테스트하지 않았지만, 당신의 경우에는 이렇게 할 것입니다.이것이 도움이 되길 바랍니다.

오래전 일인 건 알지만 해결책이 있어요다음과 같이 해결할 수 있습니다.

#intial query 

query = 'SELECT var1, var2 FROM dbo.db_name WHERE'

if status :

        query = query + " AND status='" + status + "'"

if type :

        query = query + " AND Type='" + type + "'"  

if number :

        query = query + " AND Number='" + number + "'"

if cancel_request:

        query = query + " AND CancelRequest='" + cancel_request + "'"


query = query + ' ORDER BY transid DESC'


cur.execute(query)        

언급URL : https://stackoverflow.com/questions/16240041/sql-search-multiple-values-in-same-field

반응형