【问题标题】:How can I insert a hyphen in the middle of an alpha numerical string?如何在字母数字字符串的中间插入连字符?
【发布时间】:2014-05-15 02:56:49
【问题描述】:

我的查询当前产生的输出是 Part Number 作为一个值:

SELECT UPPER(PartNumber)AS "Part Number",
    INITCAP(PartDesc)AS "Description"
FROM Part 
WHERE UnitPrice*UnitsOnHand <1000
ORDER BY PartDesc DESC;

Part Number Description                            
----------- ----------------------------------------
BA74        Baseball Bat                             
CA14        Skillet - 12 Inch                        
AZ52        Roller Skates                            

结果仍应为 2 列,但已修改:

Part Number Description                            
----------- ----------------------------------------
BA-74       Baseball Bat                             
CA-14       Skillet - 12 Inch                        
AZ-52       Roller Skates                            

Part Number 总是有字母/数字字符,Description 只是字母。我需要做的是在字母和数字字符之间插入一个连字符。它们将永远是字母/数字永远不会改变。

【问题讨论】:

  • 请将您的数据作为格式化文本添加到问题中,而不是(难以发现)图像链接 - 毕竟没有太多需要重新输入的内容。并显示预期的输出,并解释逻辑和任何复杂性。例如,零件编号是否总是两个字符后跟两个数字,或者可以有所不同?如果情况不同,字符总是排在第一位吗,或者您可以有类似 12ABA12B 的内容 - 您希望结果是什么?
  • 更好 *8-) 但它是否总是相同的模式,AA99,或者在数字之前是否有可变数量的字符?以后还能有更多角色吗?

标签: sql oracle oracle11g


【解决方案1】:

这个问题仍然缺少一些细节,但如果我的模式正确,并且你想用连字符将第一块只是字母字符与其他所有字符分开,你可以使用一对正则表达式和字符串串联:

SELECT UPPER(
      REGEXP_SUBSTR(PartNumber, '[[:alpha:]]+')
      ||'-'||
      REGEXP_SUBSTR(PartNumber, '[^[:alpha:]]+.*')
    ) AS "Part Number",
    INITCAP(PartDesc)AS "Description"
FROM Part 
WHERE UnitPrice*UnitsOnHand <1000
ORDER BY PartDesc DESC;

Part Number           Description                  
--------------------- ------------------------------
CA-14                 Skillet - 12 Inch              
AZ-52                 Roller Skates                  
BA-74                 Baseball Bat                   

这适用于更复杂的值,只要部件号始终以字符开头:

WITH Part AS (
    SELECT 'b9a74' AS PartNumber, 'baseball BAT' AS PartDesc,
        20 AS UnitPrice, 20 AS UnitsOnHand FROM DUAL
    UNION ALL SELECT 'ca14a1', 'sKiLlEt - 12 iNCH', 20, 20 FROM DUAL
    UNION ALL SELECT 'aza52', 'roller sKaTeS', 20, 20 FROM DUAL
)
SELECT UPPER(
      REGEXP_SUBSTR(PartNumber, '[[:alpha:]]+')
      ||'-'||
      REGEXP_SUBSTR(PartNumber, '[^[:alpha:]]+.*')
    ) AS "Part Number",
    INITCAP(PartDesc)AS "Description"
FROM Part 
WHERE UnitPrice*UnitsOnHand <1000
ORDER BY PartDesc DESC;

Part Number   Description     
------------- -----------------
CA-14A1       Skillet - 12 Inch 
AZA-52        Roller Skates     
B-9A74        Baseball Bat      

但请注意,它总是插入一个连字符,这似乎是您想要的;它不会分隔所有字符和数字组(例如 B9A74B-9-A-74)。它只是在第一个非字母字符之前放置一个连字符。

【讨论】:

  • 非常感谢亚历克斯普尔
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2021-03-31
相关资源
最近更新 更多