복붙노트

[SQL] MySQL은 단일 키워드 WHERE 조건 하나를 사용하여 테이블의 모든 열을 검색

SQL

MySQL은 단일 키워드 WHERE 조건 하나를 사용하여 테이블의 모든 열을 검색

나는 64 개 다른 필드로 구성 테이블이있다. 나는 거기에 하나의 키워드를 검색하기 위하여려고하고, 결과는 모든 필드에서 키워드와 일치해야합니다. 몇 가지 제안을 제공합니다.

해결법

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

    1.

    SELECT * FROM `some_table`
    WHERE
    CONCAT_WS('|',`column1`,`column2`,`column3`,`column4`,`column64`) # single condition, many columns
    LIKE '%VT%'
    

    짜잔.

    '|' 분리, 그런데, 예를 들어, 우연 일치하는 경우, "VT"에 대한 검색에서 당신에게 거짓 양성을 줄 것 'T'와 'V'와 2 열 시작에서, 컬럼 끝을 찾는 당신을 방지하는 것입니다.

    나는 확실하지 위의 방법이 더 빨리 또는 방법보다 경우 (나는 그들이 동일한 속도를 추측 것)이야,하지만 당신은 손으로 쿼리를 작성하는 경우 그것은 확실히 덜 입력을 포함한다.

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

    2.어디 또는 여러 조건으로 사용할 수 있습니다

    어디 또는 여러 조건으로 사용할 수 있습니다

    처럼

    where
    name = 'expected'
    OR rate ='expected' 
    OR country ='expected'
    
  3. ==============================

    3.나는 긴 쿼리 존재의 간단하지만 주위에 방법을 볼 수 없습니다 :

    나는 긴 쿼리 존재의 간단하지만 주위에 방법을 볼 수 없습니다 :

    SET @term = "Somesearch";
    SELECT id, title FROM sometable WHERE
        col1 LIKE '%@term%' OR
        col2 LIKE '%@term%' OR
        col3 LIKE '%@term%' ...;
    

    대신 MySQL의 변수를 사용하여, 당신은 단지 언어 별 변수를 사용할 수 있지만 예를 위해, 나는 MySQL의 자체 고수라고 생각했다.

    당신이 다른 61 열 / 필드를 배치 줄 곳은 ... ""입니다.

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

    4.또 다른 가능성은 다음과 같이 ... 하나의 필드로 인쇄 할 모든 열을 얻을 FOR XML을 사용하는 것입니다 :

    또 다른 가능성은 다음과 같이 ... 하나의 필드로 인쇄 할 모든 열을 얻을 FOR XML을 사용하는 것입니다 :

    SELECT c.*
    FROM (
    SELECT a.*
    ,( SELECT *
       FROM table_to_search b
       WHERE a.KeyField = b.KeyField
       FOR XML RAW) AS `Full_Text_Record`
    FROM table_to_search a) c
    WHERE c.`Full_Text_Record` LIKE '%Search_string%'
    

    그것은 특히 큰 테이블의 경우 실행하는 데 시간이 걸릴 수도 있지만 그 문자열이 특정 테이블에 존재 여부를 확인 할 수 무력한다.

  5. ==============================

    5.당신은 MySQL의이 SQL 서버 구문을 번역 할 수있는 경우

    당신은 MySQL의이 SQL 서버 구문을 번역 할 수있는 경우

    WHERE
    name = @keyword OR
    country = @keyword OR
    department = @keyword OR
    @keyword IS NULL -- match all when search text is empty
    
  6. ==============================

    6.간단한 해결책은 여러 관찰 보고서를 사용하는 것입니다.

    간단한 해결책은 여러 관찰 보고서를 사용하는 것입니다.

    select * from TAB where col1 like "%VAR%" OR col2 like "%VAR%" OR......col64 like "%VAR%";
    

    당신은 같은 또는 =에 따라 요구 사항을 사용할 수 있지만, 그것은 당신의 쿼리 새 열을 추가 할 때마다 변경이 필요합니다.

    다른 방법으로, 해당 테이블에 대한 SQLDump을 다음 해당 파일을 검색 할 수 있습니다.

    일부 인터넷 검색으로,

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

    7.당신은 당신의 테이블의 모든 컬럼에 대한 쿼리를 생성 한 쿼리를 작성할 수 있습니다. 스키마 ( "소유자") 아래의 예에서 'DEV_USER'입니다 당신의 64 개 필드가있는 테이블은 'CUSTOMER_INFO'라고 검색의 기준 그것에 'VT'의 값을 가진 모든 열이다 :

    당신은 당신의 테이블의 모든 컬럼에 대한 쿼리를 생성 한 쿼리를 작성할 수 있습니다. 스키마 ( "소유자") 아래의 예에서 'DEV_USER'입니다 당신의 64 개 필드가있는 테이블은 'CUSTOMER_INFO'라고 검색의 기준 그것에 'VT'의 값을 가진 모든 열이다 :

    select 'SELECT ' || COLUMN_NAME || ' FROM CUSTOMER_INFO
    WHERE '  || COLUMN_NAME || q'# LIKE '%VT%';#'
    FROM ALL_TAB_COLS 
    WHERE OWNER = 'DEV_USER'
    AND TABLE_NAME = 'CUSTOMER_INFO'; 
    

    이 하나 개의 쿼리는 각 필드에 대한 쿼리를 생성합니다. 다음은 위의 실행 결과;

    SELECT ADDRESS_1 FROM CUSTOMER_INFO
    WHERE ADDRESS_1 LIKE '%VT%';
    
    SELECT ADDRESS_2 FROM CUSTOMER_INFO
    WHERE ADDRESS_2 LIKE '%VT%';
    
    SELECT CITY FROM CUSTOMER_ADDRESSES_QASB
    WHERE CITY LIKE '%VT%';
    
    SELECT STATE_PROVINCE FROM CUSTOMER_INFO
    WHERE STATE_PROVINCE LIKE '%VT%';
    
    SELECT ZIP_POSTAL_CODE FROM CUSTOMER_INFO
    WHERE ZIP_POSTAL_CODE LIKE '%VT%';
    WHERE LATITUDE LIKE '%VT%';
    
    ... and so on for each column in the table
    

    그럼 그냥 다른 탭으로 첫 번째 쿼리에서 생성 된 그 쿼리를 붙여 넣기를 실행합니다.

    희망이 도움이. :-)

  8. ==============================

    8.당신은 검색 모든 열이 쿼리를 생성하고 실행하는 동적 SQL을 사용할 수 있습니다.

    당신은 검색 모든 열이 쿼리를 생성하고 실행하는 동적 SQL을 사용할 수 있습니다.

    DELIMITER $$
    CREATE PROCEDURE searchAllCols(inDB VARCHAR(64), inTable VARCHAR(64), search VARCHAR(32))
    BEGIN
        SET @matches = (
            SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '` LIKE "%', search, '%"') SEPARATOR ' OR ')
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE table_name = inTable and table_schema = inDB);
        SET @query = CONCAT('SELECT * FROM `', inDB, '`.`', inTable, '` WHERE ', @matches);
        PREPARE stmt FROM @query;
        EXECUTE stmt;
    END
    $$
    DELIMITER ;
    CALL searchAllCols('table_to_search', 'searchString');
    
  9. from https://stackoverflow.com/questions/12550368/search-all-columns-of-a-table-using-a-single-where-condition-with-single-keyword by cc-by-sa and MIT license