2017-05-23 36 views
0

我有一些數據,看起來像這樣:SQL獲取文本

20170101 - Wal-Mart #111-1234-5687789-MC000555555 

20170101 - Target -1235-56444878 - MC000555555 

我想使用一個SQL查詢來獲取第二最後和第3最後一個破折號之間的字符串,所以結果會是。

1234 

1235 

這怎麼實現?由於商店名稱可能有破折號,因此從頭開始計算破折號是不可靠的,除非有某種我不知道的技巧。

謝謝。

+0

哪個數據庫? SQL服務器? MySQL的?甲骨文?或者你想要一個ansi-sql解決方案? – Dekel

+0

第一個樣本是在第三個和第四個之間 – McNets

+0

@McNets第二** **最後**和第三** **最後**短跑是OP正在尋找的東西。 – LIvanov

回答

0

我不知道除非你算破折號,否則你會如何處理這個問題。既然你不能從字符串的開頭開始計數(因爲商店的名字),也許你可以從最後算起。所以下面的組合應該做的事情你:

  • SQL reverse - 反轉字符串(這樣你就可以「從尾部開始計數」)
  • SQL charindex - 獲得一個給定char的索引在給定的串
  • SQL substring - 這樣你就可以提取所需要的數據,一旦你知道那裏的倒數第二和倒數第三個破折號是

希望這有助於歡呼聲。

1
create table test (data varchar(100)); 
insert into test values 
('20170101 - Wal-Mart #111-1234-5687789-MC000555555'), 
('20170101 - Target -1235-56444878 - MC000555555'); 


WITH Rev As 
(
    SELECT REVERSE(data) data 
    FROM test 
) 
, Pos AS 
(
    SELECT data, 
      CHARINDEX('-', data, CHARINDEX('-', data, 0) + 1) + 1 AS PIni, 
      CHARINDEX('-', data, CHARINDEX('-', data, CHARINDEX('-', data, 0)+1)+1) AS PFin 
    FROM Rev 
) 
SELECT REVERSE(SUBSTRING(data, PIni, PFin - PIni)) 
FROM Pos; 
GO 
 
| (No column name) | 
| :--------------- | 
| 1234    | 
| 1235    | 

dbfiddle here

+0

它很接近,但如果有額外的破折號,它會帶來錯誤的文字。我會試着用REVERSE來瞎搞,看看有沒有辦法讓它工作,但這對我來說是一個新的SQL領域。 – philm

+0

與反向,你可以得到它 – McNets

+0

是的,我把它反向。我使用了很多逆向工具,但它可以很好地工作。不處理數百萬行,因此如果效率低下,它仍然可以。 – philm

0

可以嵌套一個SUBSTRING_INDEX()內另一個,就像這樣:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(data,'-',-3),'-',1) FROM `test` 

這將轉最後三個「部分」,然後從中提取第一個「部分」。