Case Statement, который запускает sql - PullRequest
0 голосов
/ 25 февраля 2019

Я применяю маску к данным и считаю, что лучший способ - использовать оператор Case.Однако мне нужен оператор case для выполнения подзапроса.Когда я извлекаю данные, они будут либо числом, либо отображаться как 99999999999v999b:99999999999v999-

Использование

TO_NUMBER(REGEXP_REPLACE(RD.subm_quantity, '^(\d+)(-)?$', '\2\1'))/1000 as "Submitted_Quantity" 

Это преобразует их в число.Таким образом, если присутствует 00000000100000, он преобразуется в 100

. Однако мне нужен случай, чтобы не делить, когда он не нужен.Чтобы определить, нужно ли мне делить, мне нужно добавить правило в sql ниже:

  • , если результат 99999999999v999b:99999999999v999-, применить преобразование;
  • если нет, просто выведите RD.subm_quantity.

Как мне получить оператор case для выполнения запроса?

Запуск в TOAD для Oracle:

select m.mask 
FROM Valiuser.ivd_mapping             m,
   Valiuser.ivd_mappingset          s,
   Valiuser.ivd_mapping_record      r,
   Valiuser.ivd_transaction_file    tf,
   VALIUSER.ivd_transaction_record_details RD  
WHERE     s.mappingset_id = r.mappingset_id
   AND r.mapping_record_id = m.mapping_record_ID
   AND m.repository_column_id = '34'
   AND s.mappingset_id = tf.MAPPINGSET_ID
   AND rd.file_id = tf.file_id
   AND rd.TRANSACTION_RECORD_ID = 

1 Ответ

0 голосов
/ 25 февраля 2019

Если mask и исходный subm_quantity оба доступны из запроса, который вы показали, который кажется таким же, как тот, который включает в себя таблицу rd, на которую вы ссылаетесь в преобразовании,тогда я думаю, что вы хотите что-то вроде этого:

case when m.mask = '99999999999v999b:99999999999v999-'
     then TO_NUMBER(REGEXP_REPLACE(rd.subm_quantity, '^(\d+)(-)?$', '\2\1')) / 1000
     else rd.subm_quantity
end as "Submitted_Quantity"

, а не подзапрос.Так что подключите к вашему текущему запросу, что бы сделать это:

SELECT
  case when m.mask = '99999999999v999b:99999999999v999-'
       then TO_NUMBER(REGEXP_REPLACE(rd.subm_quantity, '^(\d+)(-)?$', '\2\1')) / 1000
       else rd.subm_quantity
  end as "Submitted_Quantity"
FROM
   Valiuser.ivd_mapping             m,
   Valiuser.ivd_mappingset          s,
   Valiuser.ivd_mapping_record      r,
   Valiuser.ivd_transaction_file    tf,
   Valiuser.ivd_transaction_record_details rd
WHERE
       s.mappingset_id = r.mappingset_id
   AND r.mapping_record_id = m.mapping_record_ID
   AND m.repository_column_id = '34'
   AND s.mappingset_id = tf.mappingset_id
   AND rd.file_id = tf.file_id
   AND rd.Transaction_Record_Id = <?>

или с современным синтаксисом соединения вместо старой версии, что-то вроде:

SELECT
  case when m.mask = '99999999999v999b:99999999999v999-'
       then TO_NUMBER(REGEXP_REPLACE(rd.subm_quantity, '^(\d+)(-)?$', '\2\1')) / 1000
       else rd.subm_quantity
  end as "Submitted_Quantity"
FROM Valiuser.ivd_mapping m
JOIN Valiuser.ivd_mapping_record r ON r.mapping_record_id = m.mapping_record_ID
JOIN Valiuser.ivd_mappingset s ON s.mappingset_id = r.mappingset_id
JOIN Valiuser.ivd_transaction_file tf ON tf.mappingset_id = s.mappingset_id
JOIN Valiuser.ivd_transaction_record_details rd ON rd.file_id = tf.file_id
WHERE m.repository_column_id = '34'
AND rd.transaction_record_id = <?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...