将字母数字列扫描到alpha或特殊字符的两列中

时间:2016-05-08 09:10:14

标签: sql regex postgresql split

我从一个需要SKU的旧项目为项目创建一个新数据库。 SKU由政府分配,但是,客户 - 为了避免必须注册新产品(需要数月)将采用现有的sku - 并在sku分配后添加各种随机性 例如:

  • 指定SKU:12345
  • 客户定义的SKU:12345ABC,或12345-Oktoberfest,或12345-123,或12345.123,或12345_Oktoberfest-123

没有办法知道他们会做什么,因为应用程序的原始设计是(最好的描述)补救...

所以我拉着标有" sku"的栏目。并且正在思考,嗯,好吧,如果我知道分裂的角色可以很容易地处理,那么就分开它:

SKU: 12345
extended_sku: ABC

主要是因为我一直在阅读有关stackoverflow的解决方案,并且有一些非常好的例子,但是对于随机性来说,这并不是一个真正的例子,我对正则表达式很感兴趣。

所以我需要知道如何测试字符串值(它是一个varchar字段)然后将其拆分为SKU bigint剥离任何非数字的东西,并将该extended_sku插入第二个表(用于规范化)使用数字sku后解析后的字符串...

无法确定sku长度,但是,它始终是数字。

所以基本上我需要在数字结束后测试任何东西

这将是来自XLSX导入的postgresql 9.5,我目前正在使用temp_table来正确格式化数据(因为同样,所有内容都是varchar字段 - 包括pk heh)

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

如果客户端生成的sku始终是原始sku的扩展名,那么client sku - original sku字符串不会为您提供所需的新创建的sku,因此您可以将其存储在单独的字段中吗?例如 - 原始sku:725AB1 - 客户端sku:725AB1_-1-_ - >新创建的sku:725AB1_-1-_ - 725AB1 = _-1-_(此处的减号操作需要实现)。

这样的东西
  1. 在客户端生成的
  2. 中搜索原始字符串
  3. 将原始字符串长度添加到在客户端<
  4. 中找到原始字符串的索引处
  5. 获取从步骤2中计算的索引开始的客户端字符串子字符串,直到字符串结尾。

答案 1 :(得分:0)

好的,解决方案是:

SELECT 
    substring(sku from '(([0-9]+.*)*[0-9]+)') AS sku, 
    substring(sku from '(([A-Za-z]+.*)*[A-Za-z]+)')  AS extended,
    sku AS original_sku
FROM catalogue 
WHERE sku !~ '^[A-Za-z]+$';

@Veverke

完美地工作:)

答案 2 :(得分:0)

这对我有用:

SELECT 
    substring(sku from '[0-9]+') AS sku,
    regexp_replace(sku, '^[0-9]+(.*)$', '\1') AS extended_sku, 
    sku AS original_sku
FROM products 

SQL Fiddle demo