2014-01-08 106 views
0

我有一些數據,如下所示:獲取數SUBSTRING()的SQL Server 2008 R2

AS WRITTEN            | UNITS | ROUTINE 
TRANSFUSE - RED BLOOD CELLS 1 UNITS ROUTINE, TRANSF... | 1  | 
TRANSFUSE - RED BLOOD CELLS 2UNITS ROUTINE, TRAN... | 2  | 
TRANSFUSE FRESH FROZEN PLASMA 2 ROUTINE    |  | 2 
TRANSFUSE - RED BLOOD CELLS 2 UNITS ROUTINE, TRAN... | 2  | 
TRANSFUSE CRYOPRECIPITATE 10 ROUTINE     |  | <- 10 SHOULD BE HERE 

我使用以下SELECT語句獲取的值,這可能是粗的方式,但這是我第一次進入SUBSTRING()CHARINDEX等。

SELECT語句:

, CASE 
    WHEN SUBSTRING(SO.DESC_AS_WRITTEN, CHARINDEX('UNIT', SO.DESC_AS_WRITTEN)-2,1) NOT IN (
     '1','2','3','4','5','6','7','8','9','10','11' 
    ) 
     THEN '' 
    ELSE SUBSTRING(SO.DESC_AS_WRITTEN, CHARINDEX('UNIT', SO.DESC_AS_WRITTEN)-2,1) 
    END AS [UNITS] 
, CASE 
    WHEN SUBSTRING(SO.DESC_AS_WRITTEN, CHARINDEX('ROUTINE', SO.DESC_AS_WRITTEN)-2,1) NOT IN (
     '1','2','3','4','5','6','7','8','9','10','11' 
    ) 
     THEN '' 
    ELSE SUBSTRING(SO.DESC_AS_WRITTEN, CHARINDEX('ROUTINE', SO.DESC_AS_WRITTEN)-2,2) 
    END AS [ROUTINE] 

正如上面有10個表示應該顯示ROUTINE下,在最後一列,但不是我不明白爲什麼。所有其他人似乎都工作得很好。

謝謝

UPDATE 從從@EkriirkE和@GoatCO大的幫助,我用下面的代碼的解決方案:

,(CAST 
    (ISNULL 
     (REPLACE 
      (REPLACE 
       (REPLACE 
        (CASE 
         WHEN PATINDEX('%[0-9]UNIT%',so.desc_as_written) > 0 
          THEN SUBSTRING(so.desc_as_written, 
           PATINDEX('%[0-9]UNIT%',so.desc_as_written)-1,2) 
         WHEN PATINDEX('%[0-9] UNIT%',so.desc_as_written) > 0 
          THEN SUBSTRING(so.desc_as_written, 
           PATINDEX('%[0-9] UNIT%',so.desc_as_written)-1,2) 
         WHEN PATINDEX('%[0-9]ROUTINE%',so.desc_as_written) > 0 
          THEN SUBSTRING(so.desc_as_written, 
           PATINDEX('%[0-9]ROUTINE%',so.desc_as_written)-1,2) 
         WHEN PATINDEX('%[0-9] ROUTINE%',so.desc_as_written) > 0 
          THEN SUBSTRING(so.desc_as_written, 
           PATINDEX('%[0-9] ROUTINE%',so.desc_as_written)-1,2) 
         WHEN PATINDEX('%[0-9]STAT%',so.desc_as_written) > 0 
          THEN SUBSTRING(so.desc_as_written, 
           PATINDEX('%[0-9]STAT%',so.desc_as_written)-1,2) 
         WHEN PATINDEX('%[0-9] STAT%',so.desc_as_written) > 0 
          THEN SUBSTRING(so.desc_as_written, 
           PATINDEX('%[0-9] STAT%',so.desc_as_written)-1,2) 
         WHEN PATINDEX('%[0-9]TODAY%',so.desc_as_written) > 0 
          THEN SUBSTRING(so.desc_as_written, 
           PATINDEX('%[0-9]TODAY%',so.desc_as_written)-1,2) 
         WHEN PATINDEX('%[0-9] TODAY%',so.desc_as_written) > 0 
          THEN SUBSTRING(so.desc_as_written, 
           PATINDEX('%[0-9] TODAY%',so.desc_as_written)-1,2) 
        END, 
       'S',''), 
      'T',''), 
     'U','') 
    , 0) 
AS INT) 
) AS [TEST] 

回答

1

這可能是更好的:

SELECT *,CASE WHEN PATINDEX('%[0-9]UNITS%',written) > 0 THEN SUBSTRING(written,PATINDEX('%[0-9]UNITS%',written)-1,2) 
       WHEN PATINDEX('%[0-9] UNITS%',written) > 0 THEN SUBSTRING(written,PATINDEX('%[0-9] UNITS%',written)-1,2) 
     END 
     ,CASE WHEN PATINDEX('%[0-9]ROUTINE%',written) > 0 THEN SUBSTRING(written,PATINDEX('%[0-9]ROUTINE%',written)-1,2) 
       WHEN PATINDEX('%[0-9] ROUTINE%',written) > 0 THEN SUBSTRING(written,PATINDEX('%[0-9] ROUTINE%',written)-1,2) 
     END 
FROM #Table1 

演示:SQL Fiddle

這可能是最簡單的包裹CASE語句內更換,而不是對付抓住人物給出的變化適當數量的,即:

SELECT *,REPLACE(CASE WHEN PATINDEX('%[0-9]UNITS%',written) > 0 THEN SUBSTRING(written,PATINDEX('%[0-9]UNITS%',written)-1,2) 
         WHEN PATINDEX('%[0-9] UNITS%',written) > 0 THEN SUBSTRING(written,PATINDEX('%[0-9] UNITS%',written)-1,2) 
       END,'S','')      
     ,REPLACE(CASE WHEN PATINDEX('%[0-9]ROUTINE%',written) > 0 THEN SUBSTRING(written,PATINDEX('%[0-9]ROUTINE%',written)-1,2) 
         WHEN PATINDEX('%[0-9] ROUTINE%',written) > 0 THEN SUBSTRING(written,PATINDEX('%[0-9] ROUTINE%',written)-1,2) 
       END,'S','') 
FROM #Table1 
+0

謝謝你,我必須玩弄它,因爲我得到以下錯誤'轉換失敗時,將varchar值's1'轉換爲數據類型int.' –

+1

@MCP_infiltrator它可能是,你有一種情況,像'CELLS1'這樣的'REPLACE()'語句包裝這些空間可能是解決這個問題的最簡單方法。 –

+0

我將不得不在REPLACE()上做一些閱讀,因爲你的回答是我第一次遇到它。感謝您的幫助 –

2

僅拍攝1後盾後焦從查找UNIT或ROUTINE開始查找2個字符。 「10 ROUTINE」返回「0」,這不在你的IN列表中。即您的代碼僅適用於單位數字。你應該採取3個字符然後2個字符長度並修剪空間,但是如果你的樣本中確實有「2UNITS」與「2個單位」的插入,你會遇到更多困難

+0

非常感謝你,這確實發揮得很好,我不會擔心因爲他們還沒有發生,但這是一個很好的觀點和我需要考慮的事情。 –

+0

@MCP_infiltrator你在你的例子'2UNITS'中有這樣一個磨合# –

+1

@Goat CO這就是爲什麼我提起它......歡迎! – EkriirkE