Как получить значение атрибута автоматически на основе других значений таблицы - PullRequest
1 голос
/ 20 октября 2019

поэтому у меня есть несколько таблиц, и я хочу заполнить атрибут базы данных на основе других значений интервала таблицы.

Основная идея заключается в заполнении атрибута 'eye-age' значениями: young, pre-prebyoticили пребиотик в зависимости от возраста пациента.

У меня есть дата рождения таблицы пациентов, и мне нужно заполнить последний атрибут значением из BirthToEyeAge, основанным на дате рождения пациента, исходя из его возраста.

Как я могусделать это, или какую документацию я должен прочитать, чтобы узнать этот тип вещей. Заранее благодарим каждого участника.

INSERT INTO BirthToEyeAge(bId, minAge , maxAge , eyeAge)        
VALUES(1, 0, 28 , 'young')
VALUES(2, 29, 59, 'probyotic')
VALUES(3, 60, 120, 'pre-probyotic')


INSERT INTO Patient( patId, firstName, lastName, birthDate )
VALUES( 1, 'Ark', 'May', '1991-7-22' );


INSERT INTO Diagnostic( diagId, date, tear_rate, consId_Consulta, eyeAge )
VALUES( 1, '2019-08-10', 'normal', 1, ??? );

1 Ответ

1 голос
/ 20 октября 2019

Вы можете объединить таблицу Patient с BirthToEyeAge, воспользовавшись удобной функцией postgres age(), чтобы вычислить возраст пациента на момент постановки диагноза. Вот запрос insert, основанный на этой логике:

insert into Diagnostic( diagId, date, tear_rate, consId_Consulta, eyeAge )
select d.*, b.bId
from
    (select 1 diagId, '2018-08-10'::date date, 'normal' tear_rate, 1 consId_Consulta ) d
    inner join patient p 
        on d.consId_Consulta = p.patId
    inner join BirthToEyeAge b 
        on extract(year from age(d.date, p.birthDate)) between b.minAge and b.maxAge;

В этой демонстрации на DB Fiddle после создания таблиц, инициализации их содержимого,и при выполнении вышеуказанного запроса содержимое Diagnostic равно:

| diagid | date                     | tear_rate | consid_consulta | eyeage |
| ------ | ------------------------ | --------- | --------------- | ------ |
| 1      | 2018-08-10T00:00:00.000Z | normal    | 1               | 1      |
...