2017-05-17 2 views
1

질문 : 영업 견적 목록이 있는데 그 중 많은 항목이 연습이나 교육을위한 시스템에있어 유효하지 않습니다. 보통 견적 이름에는 'Test'또는 'Dummy'라는 단어가 포함됩니다. (몇 가지 예에서 quote_name은 'Prova'를 포함하고 있는데, 'Test'의 경우 이탈리아어가됩니다.)LIKE 또는 IN 식의 검색 패턴 목록 사용

검색 할 문자열 목록을 쉽게 제어 할 수 없다는 점을 감안할 때 두 번째 테이블 ('검색 조건')에서 목록을 유지 관리하기로 결정했습니다. 용어 목록 ('Test', 'Prova', 'Dummy'...)이있는 간단한 하나의 열 테이블. 그러나

CASE WHEN UPPER(vx.quote_name) LIKE ('%' + UPPER(terms.term) + '%') THEN 'Y' ELSE 'N' END AS "Any DPS" 

만 목록의 첫 번째 검색어를 얻을 것 같다

아마존 Redshift에, 나는 간단한 CASE 문을 시도했다.

여러 항목이 판매되어 여러 행을 가질 수있는 동일한 견적의 경우 대개 한 행이 'Y'로 설정되고 나머지는 'N'으로 설정됩니다.

나는에 문을 수정 :

---- #4a: get a list of the quotes whose quote_names match the patterns in the list 
SELECT 
vx.master_quote_number, 
'Y' AS "Any DPS" 

FROM t_quotes vx, any_dps_search_families terms 

WHERE UPPER(vx.prod_fmly) IN ('%'+ UPPER(terms.term) +'%'); 

--- 4b: merge Any DPS results back in 

select vx.*, dps."Any DPS" 
from t_quotes vx 
LEFT JOIN transform_data_4 dps ON (vx.master_quote_number = dps.master_quote_number) 

하지만 그 중 하나가 그 일을하지 않습니다.

환경 : 아마존 Redshit (대부분 Postgres와 비슷 함). Postgres에서 이에 대한 대답이 이상적입니다. 필요한 경우이 절을 MySQL로 전환 할 수 있지만 오히려하지 않을 것입니다.

+0

사죄 I 검색 테이블 이름 혼합 -가 이용되었다 단계 4a에 및도 4b의 I '는 DPS'을 사용 하였다. 같은 테이블 - transform_data_4는 'select into'처럼 4a의 결과 단계입니다. –

+0

Redshift는 Postgres의 아주 오래된 버전을 기반으로한다고 생각합니다. 오히려 여기서 주어진 대답은 Redshift에 대한 것이어야합니다. –

+0

샘플 입력과 예상 출력을 보여주십시오. –

답변

0

이 좌우하는 경우 (안된) 조인이다

SELECT vx.master_quote_number 
FROM any_dps_search_families terms 
    CROSS JOIN LATERAL (SELECT master_quote_number 
         FROM t_quotes 
         WHERE UPPER(prod_fmly) 
          LIKE ('%' || UPPER(terms.term) || '%') 
        ) vx;