如何仅在Oracle SQL中选择特定长度的子字符串

时间:2018-05-16 00:05:38

标签: sql oracle stored-procedures plsql

我的列

值低于以下值
  • Q6wabc89WmrtUX2pNYRnwjInCAT9ZxvaY7N7KAG440360130
  • Q6wabc89WmrtUX2pNYRnwwjInCAT9ZxvaY7N7KAG4a403648jInCAT9ZxvaY7N7KwjInCAT9ZxvaY7N7AG4403601AGd4s197

第一个值的长度为48。

第二个值的长度为97.

现在条件是如果长度是任何值的97,那么只使用前48个字符,否则使用现有的。

SUBSTR功能已经存在

SELECT SUBSTR(CLNT_ID,0,48) FROM CLNT; 

工作正常,现在我只想在值的长度等于97的情况下使用它。

此Select语句是一个商店过程的一部分。 请协助确定正确的查询。 提前致谢

3 个答案:

答案 0 :(得分:2)

SELECT 
case 
  when regexp_like (CLNT_ID , '^[[:alnum:]]{97}$') 
  then SUBSTR(CLNT_ID,0,48) 
  else null 
end label1, CLNT_ID
FROM CLNT;

答案 1 :(得分:2)

我认为最简单的方法是使用length()

select (case when length(clnt_id) = 97
             then substr(clnt_id, 1, 48)
             else clnt_id
        end)
from clnt;

这似乎是最简单的逻辑实现。另请注意,substr()的第二个参数来自" 1"不是" 0",所以你应该使用" 1"那里(效果是一样的)。

答案 2 :(得分:1)

您也可以尝试这种方式,

SELECT CASE SIGN( LENGTH(:p_text) - 97 )
            WHEN -1 THEN
                :p_text
            ELSE
                SUBSTR(:p_text, 1, 48)
       END
  FROM dual;