有没有办法从带有正则表达式值的字段中选择一个值?

时间:2019-02-15 18:23:04

标签: mysql sql regex

我有一些表,其中记录中加载了正则表达式作为值。

示例:

表1

record1 - field1, field2, field3 = ^19[8-9][0-9]$    
record2 - field1, field2, field3 = ^20[0-1][0-9]$

我想通过以下方式选择:

select field1, field2 from table where field3 = '1980';  
必须使用当前值选择

record1

field1, field2

我找不到可以做到的REGEXP函数/参数。

3 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题。一种是使用IN来匹配列表中的任何内容:

SELECT ... FROM ... WHERE field3 IN (346, 868, 869, 28776)

或者对于范围,请使用BETWEEN

SELECT ... FROM ... WHERE field3 BETWEEN 1980 AND 1999

仅在实际任意字符串匹配的情况下,您才需要使用正则表达式,例如:

SELECT ... FROM ... WHERE field3 RLIKE '^XYZ-\d+$'

答案 1 :(得分:0)

您将需要类似的东西。

查询:
WITH data AS (SELECT 'Data for Row 1 Column 1' field1, 'Some random text' field2, '^19[8-9][0-9]$' REG FROM DUAL UNION SELECT 'Data for Row 2 Column 1' field1, 'Another random text' field2, '^20[0-1][0-9]$' REG FROM DUAL) SELECT field1, field2 FROM DATA WHERE REGEXP_COUNT('1999',REG) = 1;

如果您有任何问题,请告诉我。

答案 2 :(得分:0)

您可以the REGEXP operator来检查存储在列field3中的每个正则表达式的输入参数。从MySQL的早期版本(5.5)开始,REGEXP(也可以拼写为RLIKE)可用:

SELECT * FROM t WHERE '1980' REGEXP field3

从文档中:

  

expr REGEXP pat:如果字符串1与模式expr指定的正则表达式匹配,则返回pat,否则返回0。如果exprpatNULL,则返回值为NULL

从MySQL 8.0开始,也可以使用REGEXP_LIKE()

SELECT t1, t2 FROM mytable WHERE REGEXP_LIKE('1980', field3);

Demo on DB Fiddle

with t as (
  select  1 field1, 1 field2, '^19[8-9][0-9]$' field3
  UNION ALL select 2, 2, '^20[0-1][0-9]$'
)
SELECT * FROM t WHERE '1980' REGEXP field3;

| field1 | field2 | field3         |
| ------ | ------ | -------------- |
| 1      | 1      | ^19[8-9][0-9]$ |