#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 Приятно знать, что это было именно так. Я добавил кавычки к своему ответу.