業務規則查詢
現在,當我們知道如何使用基本的JSONB運算符時,讓我們編寫範例查詢以獲取一些有用的數據。假設我們正在開發一個EHR系統,該系統需要在某些屏幕上顯示高危患者列表。高風險標準如下:
- 男
- 年齡> 45歲
- 前吸煙者或活躍吸煙者
範例寫了一個查詢吸煙者的觀察結果。對其進行修改,使其包括過去的吸煙者:實施第三個條件後,讓我們將此查詢與一個患者表結合起來以實現第一個和第二個條件:
SELECT DISTINCT(p.id), p.resource#>'{name,0}'
FROM patient p
JOIN observation o ON o.resource#>>'{subject,id}' = p.id
WHERE (o.resource @> '{"code": {"coding": [{"code": "72166-2"}]}}'::jsonb)
-- LOINC: Smoking status
AND ((o.resource @> '{"value": {"CodeableConcept": { "coding": [{"code": "449868002"}]}}}')
-- SNOMED: Current every day smoker
OR (o.resource @> '{"value": {"CodeableConcept": { "coding": [{"code": "8517006"}]}}}'))
-- SNOMED: Former smoker
AND (extract(year from age(now(), (p.resource->>'birthDate')::date)) > 45) -- patient's age > 45
AND (p.resource->>'gender' = 'male'); -- patient gender is male
在此對語法解釋一下如何取出年齡部分,(p.resource->>'birthDate')為其強制轉換為PostgreSQL的DATE類型。
令人驚訝的是,我們剛剛發現60名高危患者。並不難,對吧?
FROM patient p
JOIN observation o ON o.resource#>>'{subject,id}' = p.id
WHERE (o.resource @> '{"code": {"coding": [{"code": "72166-2"}]}}'::jsonb)
-- LOINC: Smoking status
AND ((o.resource @> '{"value": {"CodeableConcept": { "coding": [{"code": "449868002"}]}}}')
-- SNOMED: Current every day smoker
OR (o.resource @> '{"value": {"CodeableConcept": { "coding": [{"code": "8517006"}]}}}'))
-- SNOMED: Former smoker
AND (extract(year from age(now(), (p.resource->>'birthDate')::date)) > 45) -- patient's age > 45
AND (p.resource->>'gender' = 'male'); -- patient gender is male
在此對語法解釋一下如何取出年齡部分,(p.resource->>'birthDate')為其強制轉換為PostgreSQL的DATE類型。
::date
Patient.birthDate
,並將DATE類型接受FHIR格式的日期。函式age(DATE, DATE)返回一個INTERVAL值,該值表示兩個時間戳之間的時間距離,取回患者的年齡。age(NOW(), (p.resource->>'birthDate')::date)>45
令人驚訝的是,我們剛剛發現60名高危患者。並不難,對吧?
沒有留言:
張貼留言