2014-11-04 105 views
0

我有一個正常的SQL語句:提取號碼從字符串SQL

SELECT VALUE_ID, UF_CRM_TASK FROM b_uts_tasks_task 

現在這個返回AA不同的領域,但每次他們採取以下形式:

a:1:{i:0;s:7:"CO_2012";} or a:1:{i:0;s:5:"CO_12";} or a:1:{i:0;s:7:"CO_2017";} 

他們基本上是不同的每次。我需要的是在CO_部分之後獲取數字。我試過TRIM,但因爲前後部分的所有內容都發生了變化,所以我認爲這不會起作用。

我已經看了堆棧溢出一段時間,找不到它。我知道如何在PHP中做到這一點:

$data = $row['UF_CRM_TASK'];  
$companyID = substr($data, strpos($data, "CO_") + 1); 
$newCompanyID = preg_replace('/[^0-9.]+/', '', $companyID); 

但不是SQL。在此先感謝

+0

MySQL不知道什麼是PHP序列化。 – 2014-11-04 09:29:08

+0

因此,您不能在SQL語句中的CO_之後提取該數字嗎?忽略PHP部分,因爲那在sql語句之後給了我答案。我需要它在SQL語句中。認爲這是可能的。 – andy 2014-11-04 09:30:17

回答

2

在MySQL是一個有點難看:

/*SUBSTRING_INDEX BASED ON CO_ AND THE LAST " - in 2 SUBSTRINGS*/ 
SELECT `VALUE_ID`, SUBSTRING_INDEX(SUBSTRING_INDEX(`UF_CRM_TASK`, 'CO_', -1), '"', 1) AS `COMPANY_ID` FROM `b_uts_tasks_task` 

在PHP中你可以unserialize()

$data = unserialize($row['UF_CRM_TASK']); 
$companyID = str_replace('CO_', '', $data[0]); 

如:

$data = unserialize('a:1:{i:0;s:5:"CO_12";}'); 
echo str_replace('CO_', '', $data[0]); 
//==> 12 
+0

問題在於,我在SQL語句中需要它,所以它會像TRIM(UF_CRM_TASK,C0 _.....)一樣作爲companyID,以便我可以在WHERE子句中使用它。我不希望它作爲PHP。 – andy 2014-11-04 09:27:31

+0

MySQL不知道PHP序列化是什麼。 – 2014-11-04 09:28:25

+0

在MySQL中解決它:) – 2014-11-04 09:35:46

0

您需要使用CHARINDEX和SubString(Microsoft SQL)或

這是示例代碼中,我爲我的微軟SQL服務器進行:

declare @companyIdString varchar(50) = 'a:1:{i:0;s:7:"CO_2012";}' 

print 'Company ID in a string: ' + @companyIdString 
print 'Find first position: ' + Cast(charindex('"CO_', @companyIdString) as varchar(2)) 
print 'Locate the second position (the last "): ' + Cast(charindex('"', @companyIdString, charindex('"CO_', @companyIdString)+4) as varchar(2)) 
print 'Extracted Company Id: ' + substring(@companyIdString,charindex('"CO_', @companyIdString)+4, charindex('"', @companyIdString, charindex('"CO_', @companyIdString)+4) - charindex('"CO_', @companyIdString) - 4) 

select 
@companyIdString as CompanyIdString, 
substring(@companyIdString,charindex('"CO_', @companyIdString)+4, charindex('"', @companyIdString, charindex('"CO_', @companyIdString)+4) - charindex('"CO_', @companyIdString) - 4) as CompanyId 

我也做了一個MySQL服務器相同的代碼:

set @companyIdString := 'a:1:{i:0;s:7:"CO_2012";}'; 

select 
@companyIdString as CompanyIdString, 
substring_index(substring_index(substring_index(@companyIdString, '"', 2), '"', -1), '_', -1) as CompanyId 

的SUBSTRING_INDEX通過定位第二個開始「(串現在是a:1:{i:0; s:7:「CO_2012),然後使用-1向後搜索以找到第一個」(字符串現在是CO_2012)。然後向後搜索下劃線(字符串現在是2012)。