Postgresql: можно ли определить, в каком столбце была найдена строка поиска? - PullRequest
0 голосов
/ 27 сентября 2018

как узнать в каком столбце была найдена строка поиска?

Мой запрос

 select DISTINCT t1.id,
 t2.position ,
 t3.name ,
 t4 age

 FROM table1 AS t1 
  LEFT JOIN  table2 AS t2 on t1.id = t2.fk_id 
  LEFT JOIN  table3 AS t3  on t3.fk_id = t2.fk_id 
 LEFT JOIN  table4 AS t4  on t4.fk_id = t3.fk_id 
 WHERE 
  t2.position like ANY(['Real Estate Agent ','25']) 
  OR          
  t3.name like ANY(['Real Estate Agent ','25'])
  OR
  t4 age like ANY(['Real Estate Agent ','25'])

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Если вы не возражаете против повторения условий:

select x.*,
       position like ANY(['Real Estate Agent ','25']) as found_in_position, 
       name like ANY(['Real Estate Agent ','25']) as found_in_name, 
       age like ANY(['Real Estate Agent ','25']) as found_in_age
from (
  select DISTINCT 
       t1.id,
       t2.position,
       t3.name,
       t4.age
  FROM table1 AS t1 
    LEFT JOIN  table2 AS t2 on t1.id = t2.fk_id 
    LEFT JOIN  table3 AS t3  on t3.fk_id = t2.fk_id 
    LEFT JOIN  table4 AS t4  on t4.fk_id = t3.fk_id 
  WHERE 
    t2.position like ANY(['Real Estate Agent ','25']) 
    OR          
    t3.name like ANY(['Real Estate Agent ','25'])
    OR
    t4.age like ANY(['Real Estate Agent ','25'])
) x;

Производная таблица (также известная как sub-select) необходима, потому что DISTINCT работает со всеми выражениями списка SELECT, и добавление флагов можетизменить исход этого.

0 голосов
/ 27 сентября 2018

Вы бы скопировали условия в select:

select . . .,
       ((case when t2.position like ANY(['Real Estate Agent ','25']) then 'position;' else '' end) ||
        (case when t2.name like ANY(['Real Estate Agent ','25']) then 'name;' else '' end) ||
        (case when t2.age like ANY(['Real Estate Agent ','25']) then 'age;' else '' end) 
       ) as matching_columns
. . .
...