【问题标题】:Query from existing worksheet values with firstname, lastname and WHERE clause needs to match on firstname and lastname使用名字、姓氏和 WHERE 子句从现有工作表值中查询需要匹配名字和姓氏
【发布时间】:2020-08-14 20:48:26
【问题描述】:

我希望使用 where 子句中的现有数据获取查询结果。要查询的现有数据和表将名字和姓氏分成 2 个字段。我需要一种方法来传递数组和单个 where 条件中的两个字段。

例如,这是我需要查询的源数据的工作表:

Dob         Last        First     SSN
6/6/2006    Notaperson  Billy     999880006
1/1/2001    Testing     Marco     999880001/217061866
2/2/2002    Case        Delilah   999880002
3/3/2003    Testcase    Julius    999880003
4/4/2004    Notreal     Adrianna  999880004
5/5/2005    Fake        Julianna  999880005
12/1/2017   Mars        Danielle  999880005

Image of source data worksheet

我需要查询任何 Dob、任何 SSN 以及任何 MATCHING 名字和姓氏。 例如: 返回 Dob=6/6/2006 和 ssn=999880006 和 FIRST/LAST=Notaperson Billy 的所有行

以下是我写的内容,但它返回了 last=Notaperson 的任何行和/或 first=Billy 的任何行。

如何设置 where 子句以搜索名字和姓氏作为单个数据值?

'''

with subjects as (
Select 
    s.subject_key
    , s.dob
    , n.last
    , n.first
    , sa_cid.alias                      as cid
    , sa_cid.facility_key               as cid_facility_key
    , sa_cid.primary_aliaås             as cid_primary_alias
    , sa_cid.subject_alias_type_key     as cid_subject_alias_type_key
    , sa.alias
    , sa.facility_key
    , sa.primary_alias
    , sa.subject_alias_type_key
from subject s

inner join subject_alias sa_cid
    on sa_cid.subject_key = s.subject_key
        and sa_cid.subject_alias_type_key = 3

inner join subject_alias sa
    on sa.subject_key = s.subject_key
        and sa.subject_alias_type_key != 3      

inner join name n
    on n.name_key = s.current_name_key

WHERE 1 = 1
    and dob = ANY(
        '{6/6/2006, 1/1/2001, 2/2/2002, 3/3/2003, 4/4/2004, 5/5/2005, 12/1/2017}')
    or (
                n.last = ANY(
                '{NOTAPERSON, TESTING, CASE, TESTCASE, NOTREAL, FAKE, MARS
                }')     
                OR n.first = ANY(
                '{BILLY, MARCO, DELILAH, JULIUS, ADRIANNA, JULIANNA, DANIELLE
                }')
            )
    or sa.alias = any('{
        999880006, 999880001/217061866, 999880002, 999880003, 999880004, 999880005, 999880005}')
)

select 
    subject_key
    , dob
    , last
    , first
    , cid
    , array_agg(alias || ':' || facility_key || ':' || subject_alias_type_key) as other_alias
from subjects 
group by subject_key, dob, last, first, cid
order by cid, dob, last, first

'''

【问题讨论】:

  • 你最后说了。 . .要么 。 . .第一的。试试“和”?
  • 如果您对搜索值进行硬编码,只需结合姓氏||' '||first_name in ('David Beckham') 并搜索。根据您的数据库,您需要选择连接方法。
  • 谢谢大卫,你是对的......我有点马虎。 last 和 first 是准确的。

标签: sql where-clause


【解决方案1】:

只需选择您的输入,并跳过所有连接,因为我们没有来自其他表的输入。 你的意思是这样的吗?您可以将行表达式放入IN() 列表...

请注意,ANY('{}') 表达式绝不是典型的 SQL 语法,而用于指定一组值(或者实际上是行)的 IN() 表示法是。

WITH
input(dob,last,first,ssn) AS (
          SELECT DATE '6/6/2006' ,'Notaperson','Billy'   ,'999880006'           
UNION ALL SELECT DATE '1/1/2001' ,'Testing'   ,'Marco'   ,'999880001/217061866'
UNION ALL SELECT DATE '2/2/2002' ,'Case'      ,'Delilah' ,'999880002'
UNION ALL SELECT DATE '3/3/2003' ,'Testcase'  ,'Julius'  ,'999880003'
UNION ALL SELECT DATE '4/4/2004' ,'Notreal'   ,'Adrianna','999880004'
UNION ALL SELECT DATE '5/5/2005' ,'Fake'      ,'Julianna','999880005'
UNION ALL SELECT DATE '12/1/2017','Mars'      ,'Danielle','999880005'
)
SELECT
  *
FROM input
WHERE dob IN (
  DATE '6/6/2006' 
, DATE '1/1/2001' 
, DATE '2/2/2002' 
, DATE '3/3/2003' 
, DATE '4/4/2004' 
, DATE '5/5/2005' 
, DATE '12/1/2017'
)
  OR (last,first) IN (
     ('Notaperson', 'Billy'   )
   , ('Testing'   , 'Marco'   )
   , ('Case'      , 'Delilah' )
   , ('Testcase'  , 'Julius'  )
   , ('Notreal'   , 'Adrianna')
   , ('Fake'      , 'Julianna')
   , ('Mars'      , 'Danielle')
)
-- out     dob     |    last    |  first   |         ssn        
-- out ------------+------------+----------+--------------------
-- out  2006-06-06 | Notaperson | Billy    | 999880006
-- out  2001-01-01 | Testing    | Marco    | 999880001/217061866
-- out  2002-02-02 | Case       | Delilah  | 999880002
-- out  2003-03-03 | Testcase   | Julius   | 999880003
-- out  2004-04-04 | Notreal    | Adrianna | 999880004
-- out  2005-05-05 | Fake       | Julianna | 999880005
-- out  2017-12-01 | Mars       | Danielle | 999880005

【讨论】:

  • 我相信“marcothesane”已经简化并解决了这个问题。太棒了!我要进一步测试
  • 进一步测试,可以确认@marcothesane 提供了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多