【问题标题】:Impala regex to find "2", but not "255", in pipe-delimited listImpala 正则表达式在管道分隔列表中查找“2”,但不是“255”
【发布时间】:2015-07-11 05:31:22
【问题描述】:

originally asked for help 在管道分隔列表中查找值,其中值必须包含 45,但绝不包括 23。但是,接受的解决方案本身会返回值 255

我有一个带有管道分隔值的数据集,可以是0,1,2,3,4 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%"                          

【问题讨论】:

    标签: mysql sql regex impala


    【解决方案1】:
        clin_sig     REGEXP '^[[:<:]](4|5)[[:>:]]$'
    AND clin_sig NOT REGEXP '^[[:<:]](2|3)[[:>:]]$'
    

    请提供更多测试用例。

    【讨论】:

    • 我认为你需要摆脱锚。您想在数字和管道之间匹配字符串 or 的开头或结尾。单词边界处理这两种情况。
    • 我尝试在有锚和没有锚的情况下运行它,它在 impala 中导致以下错误:您的查询有以下错误:请求 6360 的错误状态:TGetOperationStatusResp(status= TStatus(errorCode=None, errorMessage=None, sqlState=None, infoMessages=None, statusCode=0), operationState=5, errorMessage=None, sqlState=None, errorCode=None)
    猜你喜欢
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2020-09-27
    • 2018-06-12
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多