我有一些表,其中记录中加载了正则表达式作为值。
示例:
表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
函数/参数。
答案 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
。如果expr
或pat
为NULL
,则返回值为NULL
。
从MySQL 8.0开始,也可以使用REGEXP_LIKE()
:
SELECT t1, t2 FROM mytable WHERE REGEXP_LIKE('1980', field3);
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]$ |