运行sql的Case语句

时间:2019-02-25 17:31:35

标签: sql oracle

我正在对数据应用掩码,并且认为最好的方法是使用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 for 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 :(得分:1)

如果您显示的查询中同时提供了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 = <?>
相关问题