2015-07-11 58 views
1

originally asked for help在管道分隔的列表,其中的值必須包括45,但從來沒有23找到值。但是,接受的解決方案本身會返回值255黑斑羚正則表達式來找到「2」,而不是「255」,在管道分隔列表

我有管道分隔值的數據集可以是01234 0R 255,比如這個:

| colA | 
____________ 
| 1|1|0|255 | 
| 5|4|4|2 | 
| 5|4|4|3 | 
| 5|4|4|4 | 
| 1|0|0|0 | 
| 0|2|0|1|2 | 
| 5|5|0|5 | 
| 0|5  | 
| 5|5|255|255| 
| 0|3|1|2|3 | 
| 5|5|5|2|3|3| 
| 0|2|0|0|0|2| 
| 5|255|1|1|5| 
| 4|255|4 | 
| 2|2|3  | 
| 255|0  | 
| 5   | 
| 5|5|1  | 

我需要一個查詢將返回行,其中包括值爲45,但從不是23

| colA | 
____________ 
| 5|4|4|3 | 
| 5|4|4|4 | 
| 5|5|0|5 | 
| 0|5  | 
| 5|5|255|255| 
| 5|255|1|1|5| 
| 4|255|4 | 
| 5   | 
| 5|5|1  | 

我來最接近的是此查詢:

SELECT clin.clin_sig 
FROM clinvar clin 
WHERE (clin_sig NOT REGEXP '3|2[^5]' 
AND clin_sig REGEXP '4|[^25]5') 

但它缺少以下項,所以東西是靠不住的:

  • 5
  • 5|255
  • 5|5|5|5|5|5|5
  • 5|0
  • 5|255|255
  • 5|5|1

我也試過,但它是非常緩慢的,仍然失蹤的幾個結果:

WHERE (clin.clin_sig LIKE "%4%" OR clin.clin_sig REGEXP "^5$" 
    OR clin.clin_sig REGEXP "^5\\|" 
    OR clin.clin_sig REGEXP "\\|5$" OR clin.clin_sig REGEXP "\\|5\\|") 
AND clin.clin_sig NOT REGEXP "^2$" 
AND clin.clin_sig NOT REGEXP "\\|2$" 
AND clin.clin_sig NOT REGEXP "^2\\|" 
AND clin.clin_sig NOT LIKE "%3%"       

回答

2
clin_sig  REGEXP '^[[:<:]](4|5)[[:>:]]$' 
AND clin_sig NOT REGEXP '^[[:<:]](2|3)[[:>:]]$' 

請提供更多的測試用例。

+1

我認爲你需要擺脫錨。你想匹配數字和管道之間的字符串**或**的開始或結束。詞邊界處理這兩個條件。 –

+0

我試圖既沒有錨運行它,和它導致以下錯誤在因帕拉: 你的查詢有以下錯誤(S): 的請求6360壞狀態:TGetOperationStatusResp(狀態= TStatus(的errorCode = None,errorMessage = None,sqlState = None,infoMessages = None,statusCode = 0),operationState = 5,errorMessage = None,sqlState = None,errorCode = None) – SummerEla