복붙노트

[SQL] SQL LIKE %의 내부 어레이

SQL

SQL LIKE %의 내부 어레이

그래서 같은 단일 값에 대한 SQL LIKE %의 쿼리를 수행하는 방법을 알고 :

SELECT * FROM users WHERE name LIKE %tom%;

내 LIKE에 대한 검색어가 배열에서 유래하지만 만약 내가 어떻게 이렇게합니까? 예를 들어, 우리는이 같은 배열을 가정 해 봅시다 :

$words = array("Tom", "Smith", "Larry");

어떻게처럼 내 배열의 단어를 검색 내 SQL LIKE의 %를 수행 할 :

SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]%

foreach는 루프 또는 뭔가 내부 전체 쿼리를주지 않고

편집 : 내가 CakePHP의 찾기 ( '모든') 방법의 조건 내에서 CakePHP는이 일을 해요 언급하는 그래서 복잡하게 물건을 조금 잊어 버렸습니다.

감사

해결법

  1. ==============================

    1.

    $sql = array('0'); // Stop errors when $words is empty
    
    foreach($words as $word){
        $sql[] = 'name LIKE %'.$word.'%'
    }
    
    $sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
    

    편집 : CakePHP의 코드는 옵션 :

    foreach($words as $word){
        $sql[] = array('Model.name LIKE' => '%'.$word.'%');
    }
    
    $this->Model->find('all', array(
        'conditions' => array(
            'OR' => $sql
        )
    ));
    

    이 물건에 최대 읽기 : http://book.cakephp.org/1.3/en/view/1030/Complex-Find-Conditions

  2. ==============================

    2.표준 SQL의 경우, 다음과 같습니다

    표준 SQL의 경우, 다음과 같습니다

    SELECT * FROM users WHERE name LIKE '%tom%' 
                           OR name LIKE '%smith%' 
                           OR name LIKE '%larry%';
    

    당신이 MySQL을 사용하고 있기 때문에 당신은 RLIKE (일명, REGEXP)를 사용할 수 있습니다

    SELECT * FROM users WHERE name RLIKE 'tom|smith|larry';
    
  3. ==============================

    3.당신은 할 수 없습니다. 이 와일드 카드에 대한 어떠한 지원, ... % .. % 또는 필드 % 등 .. % 나 있습니다 .... 곳과 같은 체인으로 연결된 필드로 절에서만 수행 추출물 문자열 일치해야합니다.

    당신은 할 수 없습니다. 이 와일드 카드에 대한 어떠한 지원, ... % .. % 또는 필드 % 등 .. % 나 있습니다 .... 곳과 같은 체인으로 연결된 필드로 절에서만 수행 추출물 문자열 일치해야합니다.

  4. ==============================

    4.정규 표현식을 사용하여 시도

    정규 표현식을 사용하여 시도

    SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry';
    
  5. ==============================

    5.난 그냥 472,084의 코드를했다.

    난 그냥 472,084의 코드를했다.

    $sql = array('0'); // Stop errors when $words is empty
    
    foreach($words as $word){
        $sql[] = 'name LIKE %'.$word.'%'
    }
    
    $sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
    

    그것은 나에게 오류 SQL을 반환 있기 때문에 내 자신을 위해, 나는 그것을 수정했다. 스레드를 읽을거야 사람들을 위해 I 포스트를.

    foreach($words as $word){
        $sql[] = 'name LIKE \'%'.$word.'%\'';
    }
    
    $sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
    

    그들 사이의 차이가 인용에 관한 것입니다, 내 MySQL의 DB는 문제가했다! 그래서 내가 $ SQL [] = '이름 % LIKE'. $ 단어에서 견적을 탈출했다. '%' 지금은 작업이 완벽합니다.

  6. ==============================

    6./ ** * 내파 "[]"블록과 다른 문자들을 그룹화 값의 다차원 어레이. 내파 배열 * @param 배열 $ 어레이 내파 배열 * @ 반환 문자열 * / 함수 hoArray2SqlLike ($ 배열) { 만약 (!의는 is_array ($ 배열)) $ 배열을 반환;

    / ** * 내파 "[]"블록과 다른 문자들을 그룹화 값의 다차원 어레이. 내파 배열 * @param 배열 $ 어레이 내파 배열 * @ 반환 문자열 * / 함수 hoArray2SqlLike ($ 배열) { 만약 (!의는 is_array ($ 배열)) $ 배열을 반환;

    $values  = array();
    $strings = array();
    
    foreach ( $array as $value )
    {
        foreach ( str_split( $value ) as $key => $char )
        {
            if ( ! is_array( $values[ $key ] ) )
            {
                if ( isset( $values[ $key ] ) )
                {
                    if ( $values[ $key ] != $char )
                    {
                        $values[ $key ]     = array( $values[ $key ] );
                        $values[ $key ][]   = $char;
                    }
                }
                else
                    $values[ $key ] = $char;
            }
            elseif ( ! array_search( $char , $values[ $key ] ) )
                $values[ $key ][] = $char;
        }
    }
    
    foreach ( $values as $value )
    {
        if ( is_array( $value ) )
            $value = '['.implode( '', $value ).']';
    
        $strings[] = $value;
    }
    
    return implode( '', $strings );
    

    }

  7. ==============================

    7.이 코드에서 우리는 SQL 쿼리에 따옴표를 얻을 수 없다

    이 코드에서 우리는 SQL 쿼리에 따옴표를 얻을 수 없다

    $sql = array('0'); // Stop errors when $words is empty
    
    foreach($words as $word){
        $sql[] = 'name LIKE %'.$word.'%'
    }
    
    $sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
    
    SELECT * FROM person where name like %"Tom"% OR name like %"Smith"% OR name like %"Larry"%;
    // error in double quotes and % is out side of Double quotes .
    

    또는 당신은 쉼표로 분리 된 값을 사용할 수 있습니다 : -

    $name = array(Tom, Smith, Larry);
    
    $sql="SELECT * FROM person";
    
        extract($_POST);
        if ($name!=NULL){
        $exp_arr= array_map('trim', explode(",",$name));
        echo var_export($exp_arr);
        //die;
            foreach($exp_arr as $val){
            $arr = "'%{$val}%'";
            $new_arr[] = 'name like '.$arr;
            }
    
          $new_arr = implode(" OR ", $new_arr);
          echo $sql.=" where ".$new_arr;
        }
            else {$sql.="";}
    

    이 같은 에코 SQL 쿼리 : -

    SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%';
    
  8. ==============================

    8.대부분의 SQL 시스템은 문자 값으로 밀어 보자. CHAR (10) = 바꿈. 그래서 가끔, 대신 코딩 모든 탈출 운동, 당신은 너무 많은 다른 코딩 문제없이 SQL 문자열이 방법으로 작은 따옴표, 큰 따옴표 및 다른 일을 푸시 할 수 있습니다.

    대부분의 SQL 시스템은 문자 값으로 밀어 보자. CHAR (10) = 바꿈. 그래서 가끔, 대신 코딩 모든 탈출 운동, 당신은 너무 많은 다른 코딩 문제없이 SQL 문자열이 방법으로 작은 따옴표, 큰 따옴표 및 다른 일을 푸시 할 수 있습니다.

    힌트를 - 그냥.

  9. from https://stackoverflow.com/questions/9416062/sql-like-inside-array by cc-by-sa and MIT license