2017-09-03 76 views
0

我有以下SQL結果條目。從文本列中提取嵌套字符串

Result 
--------- 
TW - 5657980 Due Date updated : to <strong>2017-08-13 10:21:00</strong> by <strong>System</strong> 
TW - 5657980 Priority updated from <strong> Medium</strong> to <strong>Low</strong> by <strong>System</strong> 
TW - 5657980 Material added: <strong>1000 : Cash in Bank - Operating (Old)/ QTY:2</strong> by <strong>System</strong>#9243 
TW - 5657980 Labor added <strong>Kelsey Franks/14:00 hours </strong> by <strong>System</strong>#65197 

現在我試圖從這一結果的簡短說明,並試圖將其遷移到另一列在同一個表。

Expected result 
-------------- 
Due Date Updated 
Priority Updated 
Material Added 
Labor Added 

忽略前13個字符。對於大多數情況下,它以「更新」結束。幾乎沒有'添加'結束。它應該是不區分大小寫的。
有什麼辦法可以得到預期的結果。

+0

沒有足夠的信息來定義您的任務。 –

+0

@Erwin:我想在sql中提取字符串,並希望如上所述期待結果。 –

+0

缺少重要信息:「簡短描述」是否總是以「更新」或「添加」結尾?區分大小寫? (這些詞都不會出現一次以上?)我們總是忽略的主要部分總是13個字符長嗎?或者如何確定字符串的開始和結束? –

回答

1

使用正則表達式與substring()解決方案。它跳過前13個字符,然後將字符串截至第一個'更新''添加',不區分大小寫,前導空白。別的NULL

SELECT substring(result, '(?i)^.{13}(.*? (?:updated|added))') 
FROM tbl; 

的正則表達式說明:

(?i) .. meta-syntax切換到不區分大小寫匹配
^ ..串
.{13}的開始..跳過前13個字符
() ..捕獲圓括號(捕獲有效載荷)
.*? ..任意數量的字符(non-greedy
(?:) ..非捕獲括號
(?:updated|added) .. 2個分支(字符串中的 '更新' 或 '加')


如果我們不能依靠13個主角like you later commented結束,我們需要一些其他可靠的定義。你的困難似乎比實際的實現更朦朧的要求。

說,我們正在處理的1個或多個非數字,隨後用1個或多個數字,一個空格,然後淨荷如上定義:

SELECT substring(result, '(?i)^\D+\d+ (.*? (?:updated|added))') ... 

\d ..類簡寫數字
\D ..非數字,與\d相反

+0

感謝您的信息。有沒有可能找到13個字符的長度?我發現如果它的12或11個字符會給出錯誤的結果。 –

+0

如果我們獲得動態字符長度,它將會很好。有時它的10,11,12或13。 –

+0

@PranavUnde:所有可能的,你只需要在問題*中提供完整的信息*。如果不是位置14,什麼定義了字符串的開頭?第一個數字序列之後的第一個非數字和空白?我根據我的教育猜測增加了另一種解決方案。 –