2016-05-08 73 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

相關問題