Postgres: СОЕДИНЕНИЕ между значением JSON и ТЕКСТОМ - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь объединить 2 таблицы. Значение, к которому я пытаюсь присоединиться, хранится в столбце JSON в одной таблице и в столбце TEXT в другой. Вот мой запрос:

SELECT inv.data -> 'total_amount' as iTotalAmount, 
   inv.data -> 'due_date' as iDueDate,
   inv.data -> 'emission_date' as iEmissionDate,
   inv.data -> 'customer_name' as iCustomerName, 
   matc.ch_number as mCompanyHouseNumber,
   matc.acc_software_company_name as mAccSoftName
   FROM invoices inv, matching_ch_acc_software matc
   JOIN mCompanyHouseNumber on iCustomerName
   WHERE inv.rating_data IS NOT null 

Однако я получаю следующую ошибку:

SQL Error [42P01]: ERROR: relation "mcompanyhousenumber" does not exist Position: 363

Я предположил, что вы не можете использовать значения, определенные в запросе, как часть условия JOIN? Что будет обходить?

РЕДАКТИРОВАТЬ

обновленный запрос:

SELECT inv.data -> 'total_amount' as iTotalAmount, 
   inv.data -> 'due_date' as iDueDate,
   inv.data -> 'emission_date' as iEmissionDate,
   inv.data -> 'customer_name' as iCustomerName, 
   matc.ch_number as mCompanyHouseNumber,
   matc.acc_software_company_name as mAccSoftName
   FROM invoices inv, matching_ch_acc_software matc
   INNER JOIN matching_ch_acc_software
   ON (invoices.data -> 'customer_name')::text =  matching_ch_acc_software.acc_software_company_name
   WHERE inv.rating_data IS NOT null 

ошибка:

SQL Error [42P01]: ERROR: invalid reference to FROM-clause entry for table "invoices" Hint: There is an entry for table "inv", but it cannot be referenced from this part of the query. Position: 397

1 Ответ

2 голосов
/ 21 марта 2020

Текст вашего запроса искажен настолько, что я даже не могу понять, каково его намерение. Вы объединяете 3 вещи, одна из которых выглядит как псевдоним столбца, а не как таблица.

Вы не можете использовать псевдонимы списка выбора в своем условии соединения. Вам нужно явно ссылаться на столбцы / выражения.

ON table1.text_column = table2.json_column->>'thing'

Основываясь на ваших изменениях, я думаю, что увижу намерение там. то есть Вы присоединяете его к себе с помощью INNER JOIN, а к другой таблице с помощью ,. Так как явные объединения труднее запятых, в момент оценки внутреннего соединения таблица счетов еще не «доступна», поэтому вы получаете сообщение об ошибке. Кроме того, после присвоения псевдонима таблице вы должны ссылаться на столбцы с этим псевдонимом, а не с исходным именем таблицы.

Наконец, (invoices.data -> 'customer_name')::text означает то же самое, что и invoices.data->>'customer_name', но более уродливо.

SELECT inv.data -> 'total_amount' as iTotalAmount, 
   inv.data -> 'due_date' as iDueDate,
   inv.data -> 'emission_date' as iEmissionDate,
   inv.data -> 'customer_name' as iCustomerName, 
   matc.ch_number as mCompanyHouseNumber,
   matc.acc_software_company_name as mAccSoftName
   FROM invoices inv INNER JOIN matching_ch_acc_software matc
   ON inv.data ->> 'customer_name' =  matc.acc_software_company_name
   WHERE inv.rating_data IS NOT null ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...