【问题标题】:SQL query to get 6 digits in the output value?SQL查询以获取输出值中的6位数字?
【发布时间】:2022-01-18 20:17:42
【问题描述】:

我有一个查询,输出如下

select position_id from per_all_people_F
Position_id
FRT567
GFT890
GFT000876
ABC00046

我如何确保在前 3 个字母之后,数字必须是 6 位数。

比如说:

FRT567 应该是 FRT000567
GFT890 应该是 GFT000890
ABC00046 应该是ABC000046

如何调整我的查询以适应这种变化?

【问题讨论】:

  • “我如何确保”通常意味着您在列上寻找 约束,因此无法首先插入(更新)无效值.那是你需要的吗?您的问题的其余部分听起来有些不同-“鉴于数据原样,我如何在查询或报告的输出中对其进行修改,以便根据需要添加这些零?”请澄清。
  • 对('000000' + num,6)?除了第一个 3 个字符之外,num 将在哪里?不确定我得到你尝试过/想要的东西。
  • @Nathan_Sav RIGHT 不是有效的 Oracle 函数,+ 是 Oracle 中的加法运算符。
  • @MT0 道歉。没看Oracle标签。 :-(

标签: sql oracle


【解决方案1】:

你可以使用

SELECT SUBSTR(position_id,1,3)||LPAD(REGEXP_REPLACE(position_id,'\D+'),6,'0')
  FROM per_all_people_F

假设您的数据格式与提供的示例完全相似。

  • first piece : 前三个字母的普通子串提取
  • 第二部分:使用REGEXP_REPLACE()从字符串中只提取数字,然后将零填充到字符串中,最多六个字符
  • 然后用双管道字符连接片段

【讨论】:

    【解决方案2】:

    仅使用标准字符串函数(无正则表达式) - 在前三个字母之后拆分字符串,并在中间连接所需数量的零。即使没有数字开头(整个输入字符串只是三个字母),这也能正常工作。

    with
      t (position_id) as (
        select 'FRT567'    from dual union all
        select 'GFT890'    from dual union all
        select 'GFT000876' from dual union all
        select 'ABC00046'  from dual union all
        select 'XQY'       from dual
      )
    select position_id,
           substr(position_id, 1, 3) || rpad('0', 9 - length(position_id), '0') ||
           substr(position_id, 4) as valid_position_id
    from   t;
    
    POSITION_ID  VALID_POSITION_ID   
    ------------ --------------------
    FRT567       FRT000567           
    GFT890       GFT000890           
    GFT000876    GFT000876           
    ABC00046     ABC000046           
    XQY          XQY000000 
    

    【讨论】:

      【解决方案3】:

      您可以使用简单的字符串函数并使用SUBSTR(position_id, 1, 3) 查找前3 个字符,然后使用LPAD(SUBSTR(position_id, 4), 6, '0')|| 与剩余的用零填充的剩余字符连接起来,长度为6。如果你可以有 3 个字符的字符串,那么你可以使用 COALESCE 来确保总是有 6 个数字:

      SELECT position_id,
             SUBSTR(position_id, 1, 3) || LPAD(SUBSTR(position_id, 4), 6, '0')
               AS expanded_position_id,
      
             -- Optional version for short strings
             SUBSTR(position_id, 1, 3)
             || COALESCE(LPAD(SUBSTR(position_id, 4), 6, '0'), '000000')
               AS expanded_position_id2
      FROM   per_all_people_F
      

      其中,对于样本数据:

      CREATE TABLE per_all_people_F (position_id) as
        SELECT 'FRT567'    FROM DUAL UNION ALL
        SELECT 'GFT890'    FROM DUAL UNION ALL
        SELECT 'GFT000876' FROM DUAL UNION ALL
        SELECT 'ABC00046'  FROM DUAL UNION ALL
        SELECT 'ABC'  FROM DUAL;
      

      输出:

      POSITION_ID EXPANDED_POSITION_ID EXPANDED_POSITION_ID2
      FRT567 FRT000567 FRT000567
      GFT890 GFT000890 GFT000890
      GFT000876 GFT000876 GFT000876
      ABC00046 ABC000046 ABC000046
      ABC ABC ABC000000

      db小提琴here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        • 2018-11-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        • 2015-06-10
        相关资源
        最近更新 更多