提取重复的记录

时间:2019-01-24 10:20:50

标签: sql postgresql

我正在尝试通过名称或电话号码,基于两个不同的实例,在postgres数据库中查询类似的查询参数。我也想知道带来比赛的专栏。

我使用了Ilike语句,但这似乎不太有效和准确。

$counter = ImageRequest::whereDate('created_at', $date)->whereRaw('WHERE functional_id LIKE "1%"')->count();

我想得到一个显示名称和电话号码相似的结果,以及相似之处。

数据的预期结果应为

select t.* 
from tax_payer  t 
where t.display_name ilike ('tob') or t.phone_number ilike('08162507399') and t.tax_payer_type = 'CORPORATE' 

Name | PhoneNumber | taxIdenityNumber
tobi | 08162507399 | 12345
tob  | 08162507633 | 12346
tobiss| 081625674  | 1234
jogn  | +23408162507399 | 123467
doe  | 0708732562 | 12345

如果可能想知道带来比赛的那一栏。

这将升级为用户,无论是电话号码,姓名还是两者都在引起匹配。

3 个答案:

答案 0 :(得分:0)

您可以在自己的选择中尝试使用case语句:

select t.* , 
  case 
    when t.display_name ilike ('tob') then 'Display Name'
    else 'Phone Number'
  end as reason
from tax_payer  t 
where (t.display_name ilike ('tob') or t.phone_number ilike('08162507399')) and t.tax_payer_type = 'CORPORATE' 

此示例将添加一个名为“ reason”的列,其值为“显示名称”或“电话号码”。

如果您还想指出两者何时匹配:

select t.* , 
  case 
    when t.display_name ilike ('tob') and t.phone_number ilike('08162507399') then 'Both'
    when t.display_name ilike ('tob') then 'Display Name'
    else 'Phone Number'
  end as reason
from tax_payer  t 
where (t.display_name ilike ('tob') or t.phone_number ilike('08162507399')) and t.tax_payer_type = 'CORPORATE' 

答案 1 :(得分:0)

您可以使用字符串串联列出相似性列:

select t.*,
       ((case when t.display_name ilike 'tob' then 'display_name;' end) ||
        (case when t.phone_number ilike '08162507399' then 'phone_number;' end) ||
        (case when t.tax_payer_type ilike 'CORPORATE' then 'tax_payer_type;' end)
       ) as column_matches
from tax_payer  t 
where t.display_name ilike 'tob' or
      t.phone_number ilike '08162507399' and
      t.tax_payer_type = 'CORPORATE' ;

或者,我可能更喜欢横向连接:

select t.*,
       v.match_names
from tax_payer t inner join lateral
     (select string_agg(name) as match_names, count(*) as num_matches
      from (values (t.display_name, 'tob' 'display_name'),
                   (t.phone_number, '08162507399', 'phone_number'),
                   (t.tax_payer_type, 'CORPORATE', 'tax_payer_type')
           ) v(col, pat, name)
       where v.col ilike v.pat
     ) v
order by num_matches desc;

答案 2 :(得分:0)

为什么上述答案中的每个人都使用我不知道的“案例”条件。这很简单,您需要在脚本中添加一些小的更改。

选择t。* 来自tax_payer t 其中(((t.display_name ilike('tob%'))或(t.phone_number ilike('%08162507399%')))和t.tax_payer_type ='CORPORATE';

它将完全按照您在“结果”表中显示的结果进行显示。