如何解决从具有名字,姓氏和WHERE子句的现有工作表值中查询需要匹配名字和姓氏
我希望使用where子句中的现有数据来获取查询结果。现有的要查询的数据和表将名字和姓氏分为两个字段。我需要一种在数组和单个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,cid
order by cid,first
'''
解决方法
只需选择您的输入,然后跳过所有联接,因为我们没有其他表的输入。
你的意思是这样吗?您可以将行表达式放入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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。