2016-05-08 51 views
0

我正在为需要SKU的旧项目创建项目的新数据库。 SKU由政府指定,但客户 - 为避免注册新产品(需要数月)将采用现有sku - 并在sku分配 后添加各种随机性,例如:在字母或特殊字符上将字母数字列吐成两列

  • ASSIGNED SKU:12345
  • 客户端中定义SKU:12345ABC,或12345-啤酒节,或12345-123,或12345.123,或12345_Oktoberfest-123

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

所以我拉在列中标记为“SKU”,并在想,呵呵,好了,所以分解,如果我知道分裂的性格可以用很轻松地进行处理为:

SKU: 12345 
extended_sku: ABC 

主要因为我一直在阅读stackoverflow上的解决方案,并且有一些非常好的示例,但是对于随机性而言,并没有真正的例子,我吸取了正则表达式。因此我需要知道如何去测试字符串值(它是一个varchar字段),然后将它分割成SKU bigint,剥离所有不是数字的,然后将该extended_sku插入第二个表(用于标准化)解析字符串后的数字sku ...

有没有办法来确定sku长度,但它将始终是数字。

所以基本上我需要测试什么数字结束后

这将是从XLSX导入哪些我目前揪成temp_table正确格式的数据(因为再次的PostgreSQL 9.5,一切都一个varchar字段 - 包括pk heh)

任何想法?

回答

0

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

喜欢的东西

  1. 搜索客户端原始字符串产生一个
  2. 原始的字符串长度添加到原始字符串在客户端一个
  3. 发现该指数获得客户端串从第2步计算出的索引处开始的子字符串,直到字符串结尾。
+0

实际上,这是数据库转换,因为我正在使用现有的数据库,并将其数据导出到一个新设计正确的数据库中,因此用户将无法将物品呕吐到新的数据库中:)如果他们想要要扩展sku,他们必须从现有的sku中进行选择,因为extended_sku是该sku的批处理版本,而不是随机的sku - 这正是他们现在所做的。 –

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

的工作完美:)

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

相关问题