数据存储在Oracle数据库中,我正在使用Oracle SQL开发人员。
我试图将掩码应用于没有掩码存储的数据字段。希望是在一些查询中拉回掩模单元并且能够在其他查询中对该列求和。该字段通常以NCPDP格式存储,其数量为00000000030000
(= 30
)或00000000030000-
(= -30
)。掩码是99999999999v999b:99999999999v999-
。
我试过了
select file_id,subm_quantity, to_char(subm_quantity,'99999999999v999b')
from VALIUSER.ivd_transaction_record_details
where file_id in (1123);
如果可能,我更喜欢动态遮罩,其中使用此方法找到单个遮罩:
SELECT file_id, column_name, mask
FROM valiuser.ivd_mapping m, valiuser.ivd_mapping_record mr
, valiuser.ivd_mappingset ms, valiuser.ivd_transaction_file tf
WHERE ms.mappingset_id = mr.mappingset_id
AND mr.mapping_record_id = m.mapping_record_id
AND tf.mappingset_id = ms.mappingset_id
AND M.Column_Name = 'quantity'
AND tf.file_id = 1123;
答案 0 :(得分:0)
你的面具不太正确。首先,我不认为V
做了你想要的事情;通常它会乘以跟随它的位数,而你想要除法。其次,B
并不代表S
符号。
所以你想要这样的东西:
SELECT TO_NUMBER('00000000030000-', '99999999999999S')/1000
FROM dual;
当然,对于没有尾随符号的值00000000030000
,这将失败。您可以有条件地添加一个,但正则表达式在您的情况下可能更有用:
SELECT TO_NUMBER(REGEXP_REPLACE('00000000030000-', '^(\d+)(-)?$', '\2\1'))/1000
FROM dual;
这适用于您的两个示例值。如果您需要将其转换为CHAR
(无论出于何种原因),请在将其转换为数字后执行此操作:
SELECT TO_CHAR(TO_NUMBER(REGEXP_REPLACE('00000000030000-', '^(\d+)(-)?$', '\2\1'))/1000)
FROM dual;