MySQL-모든 열에서 값을 확인하는 방법


11

궁금합니다. 모든 값을 주어진 값으로 검색하는 좋은 방법이 있습니까? 내 목적을 위해, 그것은 빠를 필요가 없으며, 단지 일회성 일 뿐이며, 모든 필드 이름을 실제로 입력하고 싶지는 않습니다. 이것이 바로 지금 할 일이지만, 더 좋은 방법이 있다고 생각합니다.

나는 이것을 돌리고 싶다 :

SELECT * FROM table WHERE col1 = 'val' OR col2 = 'val' OR col3 = 'val';

이것으로 :

SELECT * FROM table WHERE * = 'val'

... 또는 심지어 더 나아집니다 (심각하게 의심하지만 ...)

SELECT * FROM table WHERE * like '%val%'

나는 이것을 실제로 발견했지만 실제로는 가깝지 않지만 더 가까운 것을 찾지 못했습니다.

SELECT whatever WHERE col1,col2 IN ((val1, val2), (val1, val2), ...)

차이점은 지정된 값에 대해 선택한 열을 검색하는 반면 모든 열을 단일 값으로 검색하려고합니다.

그래도 내가 궁금한 것 이상으로 말한 것처럼 중요하지 않습니다.

답변:


23

SQL은 동일한 도메인에 값 이 있을 수 있는 N 개의 열을 갖는 것이 좋은 테이블 디자인이 아니기 때문에이 작업을 수행하는 좋은 방법을 제공하지 않습니다 . 이것은 잠재적으로 "반복 그룹"당신이 열이있는 경우 등의 경우이다 phone1, phone2, phone3, ... phoneN.

동일한 논리적 도메인 값을 갖는 여러 열이있는 경우 다중 값 속성 인 경우 (예 : 전화 예제)가 될 수 있습니다. 다중 값 속성을 저장하는 표준 방법은 기본 테이블에 속한 행을 참조하여 다른 테이블에 여러 행으로있는 것입니다.

그렇게하면 종속 테이블의 한 열에서 특정 값만 검색하면됩니다.

SELECT t.* FROM mytable AS t
JOIN phones AS p ON t.primaryKey = p.refKey 
WHERE p.phone = ?

1
어떤 이유로 든 테이블 레이아웃을 변경할 수없는 경우이 형식으로 데이터를 나타내는 뷰를 작성한 다음 뷰를 쿼리 할 수 ​​있습니다.
CodeCaster

10
아니요, 테이블 레이아웃 만 변경하십시오. 그게 다야. 나는 변명 할 수 없다는 변명에 지쳤다. 나는 더 이상 받아들이지 않습니다. 변화하는 방법을 배울 차례입니다.
Bill Karwin

15

더 가깝게 얻을 수있는 것은 다음과 IN같습니다.

SELECT * FROM table WHERE 'val' IN (col1, col2, ..., colN) ;

여전히 확인하려는 모든 열을 작성해야합니다.
그리고 그것은 OR당신이 가진 표현 과 다르지 않습니다. 이것은 문자를 조금 더 적게 사용하여 표현식을 작성하는 다른 방법입니다.


3

스키마 S에서 테이블 이름이 T라고 가정하면 먼저 두 가지 단계로 수행해야합니다.

select concat(' SELECT * FROM t WHERE ''a'' in ('
             , GROUP_CONCAT(COLUMN_NAME)
             , ')')
from INFORMATION_SCHEMA.columns 
where table_schema = 's' 
  and table_name = 't'
  and DATA_TYPE IN ('char','varchar');

이제이 문자열을 실행할 수 있습니다. 'a'를 추가 '로 인용해야합니다. 예를 들어 프로 시저에 넣으면 생성 된 문자열을 준비하고 실행할 수 있습니다.

나는 다음과 같이 테스트했다.

create table t (a char(3), b varchar(5), c int);
insert into t(a,b) values ('a','b'),('b','c'),('c','c');    

쿼리는 다음 위치에서 생성되었습니다.

SELECT * FROM t WHERE 'a' in (a,b)

그리고 그 결과를 실행하면 :

a   b   c
---------
a   b   

1

이 질문을한지 1 년이 지난 것 같은 느낌이 들었지만, 내가 찾던 정확한 것으로 보이는 것을 발견했습니다! 내가 예상했던 것처럼 SQL 문이 아니지만 원하는 것을 수행합니다.

MySQL Workbench에서 테이블 또는 스키마를 마우스 오른쪽 단추로 클릭하고 테이블 데이터 검색을 선택할 수 있습니다.스키마 컨텍스트 메뉴


0

이거 한번 해봐:

select
    *
from
    _table_
where
    concat('.', col1, '.', col2, '.', col3, '.') like "%.search_value.%";

.검색 문자열 이 없다고 가정 합니다. 보장 할 수없는 경우 다른 "분리 문자"를 사용할 수 있습니다.


1
솔루션이 작동하는 이유를 설명해 주시겠습니까? 코드 전용 답변은 여기서 좋은 답변으로 보이지 않습니다.
George.Palacios

작동하지 않습니다. 예를 들어 te 검색에 포함 %되거나 _열에 포함 된 경우.
Jasen

1
@Jasen 특수 문자를 이스케이프하고 다른 구분 기호를 사용할 수 있습니다.
Anon0012398193

@ George.Palacios-불분명 한 것이 무엇입니까?
Anon0012398193

올바른 분리기를 선택하는 것은 매우 어려울 수 있습니다. 이 접근 방식은 제대로하기가 매우 어렵습니다
Jasen

0

가장 간단한 해결책은

mysqldump ... --skip-extended-insert db table | grep 'val'

하지 않는 한 SQL 구문의 일반적인 선두로부터 무언가이다.


대안이 이것이 도움이 될 것이라고 생각했기 때문에 나를 조롱하기를 바랍니다.
donutguy640

1
나는 확실히 아니다. db / table의 "where"를 모르는 경우 무언가를 찾는 올바른 방법입니다. grep은 값이 존재하는 전체 행 (테이블 이름 포함)을 리턴합니다. SQL이 아니며 출력을 프로그래밍 방식으로 처리하려는 경우 유용하지 않지만 간단하고 매우 빠릅니다.
jkavalik

-2

이 시도.

SELECT *
FROM table
WHERE CONCAT(col1,' ',col2,' ',col3)="val val val";

CONCAT ()는 여기에서와 같이 열 값을 분리하는 데 사용됩니다. 열을 공백으로 분리하여 함수 내부에 더 나은 결과를 지정하고 값을 문자열로 공백으로 분리하여 결과를 확인할 수 있습니다.


-3

information_schema 데이터베이스를 사용하면 기본적으로 특정 테이블의 모든 열을 나열한 다음 GROUP_CONCAT를 사용하여 한 줄로 나열한 다음 IN 문에 피드합니다.

select * from db.table where 'value' in (select GROUP_CONCAT(COLUMN_NAME) from INFORMATION_SCHEMA.columns where table_schema = 'db' and table_name = 'table');

모든 열에 'value'가있는 경우에만 행을 반환합니다.


1
당신은 의미 if 'value' is present in any of the columns합니까? 또한 다음과 같은 문자열 유형에 대한 조건자를 추가 할 수 있습니다.`및 DATA_TYPE IN ( 'char', 'varchar')`
Lennart

1
이렇게하면 열의 이름을 명시 적으로 피하는 OP의 목표를 달성 할 수 있습니다. 와일드 카드는 아니지만 정보 스키마에 대한 GROUP_CONCAT는 모든 열 이름의 와일드 카드만큼 좋습니다.
tbrookside

2
이 작업을 수행하는 데 문제가 있습니다. db와 table을 스키마와 테이블 이름으로 바 꾸었습니다. 실제 이름에 대한 자리 표시자가 아닌 다른 것이 있습니까? 또한 내부 명령문을 자체적으로 시도했지만 행 데이터가 아닌 열 이름을 연결한다는 것을 알고 있습니다. 그게 당신이 의도 한 것입니까?
donutguy640

4
모든면에서, 이것은 잘못된 것입니다. 쿼리는 'value'를 내용이 아닌 열 이름 과 비교 합니다 . 나는 이것을 downvote 줘야한다.
Bill Karwin

4
보다 정확하게는 문자열 'value'를 쉼표로 구분 된 열 이름 목록 인 문자열과 본질적으로 동일하게 비교 where 'value' in ('col1,col2,col3…')합니다.
Andriy M
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.