2017-04-20 3 views
0

저는 Postgres를위한 검색 도구를 만들고 있습니다. 여러 개의 텍스트 항목 (각 테이블 열에 하나씩)이 있습니다. 텍스트 항목이 비어 있으면 각 테이블 항목마다 쿼리를 일치 시키길 원합니다. 이것이 가능한가? 나는 시도했다 :Postgresql 무엇이든 모두 선택하십시오.

SELECT name FROM contacts WHERE surname = '*'; 
SELECT name FROM contacts WHERE surname = *; 

상상할 수 있듯이 *는 성 (*)이 없으므로 아무 것도 반환하지 않으며 두 번째 쿼리는 유효하지 않습니다. 어떤 아이디어?

편집 : 때문에 내가 뭐하는 거지의 성격

하는 SELECT name FROM contacts는 충분하지 않습니다. 나는 그것이 작동하게 만들 수 있다고 생각하지만 추한 것입니다. 테이블의 모든 열에 대해 WHERE을 원하지만 주어진 열의 검색이 빈 문자열 인 경우 테이블의 모든 항목을 가져 오려고합니다.

+0

'성이 '%''와 (과) 유사하거나 단순히'어디에서'완전하게. –

답변

0

좋아, 그래서 내 대답 here 찾았습니다. 올바른 코드는 다음과 같습니다

SELECT name FROM contacts WHERE surname ~* ''; 

반환 모든 항목

John Doe의 성 (姓)이
SELECT name FROM contacts WHERE surname ~* 'John Doe'; 

반환 항목.

+0

@a_horse_with_no_name 정규식이 과도하다고 동의하지만 정규식이 전체 문자열이 아닌 부분 문자열과 일치하기 때문에 해당 항목이 올바르지 않습니다. 따라서'surname ~ * '''은 모든 행에 빈 문자열이 포함되어 있고'surname ~ * 'John Doe''도''Peter-John Doe-Re-Mi' '와 일치합니다. – IMSoP

+0

@IMSoP 정확히 일치합니다 내가 찾은 것. 게다가 그것은 내가 찾고 있었던 것이다. – theGtknerd

+1

전체 문자열과 일치해야하는보다 일반적인'LIKE' 패턴 매칭을 사용하면'surname LIKE '%''와'surname LIKE '% John Doe %''와 동일합니다. PostgreSQL에서 지원하는 세 가지 유형의 패턴 일치에 대한 자세한 내용은 https://www.postgresql.org/docs/current/static/functions-matching.html을 참조하십시오. – IMSoP

0

나는 쿼리가 각각

그냥 WHERE surname 절없이 SELECT 사용하는 모든 테이블 항목을 일치합니다. 그처럼 간단합니다.

SELECT name FROM contacts 

하지만 당신은 하나의 쿼리를 사용하려는 경우, 당신이이 방법을 수행 할 수 있습니다 당신의 대답에 관해서는

cur.execute(
    """SELECT name FROM contacts 
    WHERE (CASE WHEN %(entry)s != '' THEN surname = %(entry)s ELSE true END)""" 
    , {'entry': "John Doe"} 
) 

, 당신은 정규 표현식 매칭을 사용했다. 질문에서 당신은 결코 그것을 언급하지 않았습니다. 그래서 나는 그것이 당신이 원하는 것이 아니라고 생각합니다. 정규 표현식에는 특정 구문이 있으며, 일부 잘못된 정규 표현식 형식이 텍스트 항목에 입력되면 쿼리가 실패합니다.

+0

나는 그걸 가지고 노는 시간이있을 때 이것을 확실히 시험해 보겠다. 이해하기 쉬운 질문이 없으셔서 죄송합니다. 내가 뭘 찾고 있었는지 알았지 만 무엇을 부르는 지 몰랐다. 그래서 나는 내 문제를 설명했다. 오히려 가난하게 :(내 편집을 참조하십시오. – theGtknerd

관련 문제