Как выбрать таблицу на основе параметризованного имени базы данных?

#sql

#sql

Вопрос:

Мой код принимает параметр ${ID}$ (строку) и на основе того, какой идентификатор вычисляется, я хочу выбрать другую таблицу для использования. Думаю, я не могу использовать регистр внутри оператора FROM. Некоторый пример кода выглядит так:

 select *
from ${ID}$_charges.transaction_charge
where execution_date = '2011-03-22'
  

Итак, если ID ‘N’, то я хочу использовать таблицу transaction_charge, чтобы оператор разрешал N_charges.transaction_charge

Однако, если ID это ‘B’ или ‘P’, тогда я хочу использовать другую таблицу с именем conformity_charge, и оператор будет оценивать B_charges.conformity_charge или P_charges.conformity_charge

Как я могу написать это утверждение?

Комментарии:

1. MySQL <> Postgres. Я удалил конфликтующие теги, пожалуйста, отметьте только одну базу данных, которую вы используете.

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

3. Где выполняется код, исключительно в sql, в хранимой функции / процедуре, на внешнем клиенте?

4. Он выполняется чисто sql

5. Это плохая модель данных. У вас должна быть только одна таблица со столбцом charge_type или что-то подобное. Тогда ваш запрос становится таким простым, как .. from transaction_charge where charge_type = 'B' and execution_date = '...'

Ответ №1:

Если у вас небольшое количество возможных целевых таблиц, самое близкое, что вы можете получить, помимо динамического SQL, это:

ПРИМЕЧАНИЕ: В зависимости от возможностей вашего ядра базы данных и размера ваших таблиц могут возникнуть проблемы с производительностью, которые могут иметь или не иметь значения.

 SELECT a, b, c
FROM (
   SELECT 'N' as TableName, a, b, c
   FROM N_charges.transaction_charge
   UNION ALL
   SELECT 'P' as TableName, a, b, c
   FROM P_charges.transaction_charge
   UNION ALL
   SELECT 'B' as TableName, a, b, c
   FROM B_charges.transaction_charge
) t
WHERE TableName = '${ID}$'

# Another variation
SELECT a, b, c
FROM N_charges.transaction_charge
WHERE 'N' = '${ID}$'
UNION ALL
SELECT a, b, c
FROM P_charges.transaction_charge
WHERE 'P' = '${ID}$'
UNION ALL
SELECT a, b, c
FROM B_charges.transaction_charge
WHERE 'B' = '${ID}$'


  

Комментарии:

1. Для первого варианта я продолжаю получать следующую ошибку: «столбец «N» не существует в t» при использовании идентификатора N для exmaple

2. @DanHoward Вы получаете сообщение об ошибке, потому что использование ${ID}$ для параметра не кажется правильным синтаксисом. Чтобы знать, что именно писать, мне нужно знать, какой движок базы данных вы используете и какой язык, инструмент и т.д. запрос выполняется из. Было бы хорошо, если бы вы пометили свой вопрос с помощью компонента database engine, который вы используете. Это может быть так же просто, как писать '${ID}$' , но я не могу знать.

3. Это было так же просто, как написать ‘${ID} $’ ха-ха-ха, спасибо вам и спасибо за совет. Я обязательно буду более информативным в своих сообщениях.

4. @DanHoward Приятно знать, что это было именно так. Я добавил кавычки к своему ответу.