select CASE
WHEN ComExgRateDetailLog.NotificationMinute = '*'
THEN
1
ELSE
IF(FIND_IN_SET(
CAST(
DATE_FORMAT(
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:00'),
'%i') AS SIGNED),
ComExgRateDetailLog.NotificationMinute) > 0,
1,
0)
END
From ComExgRateDetailLog
我希望在 Oracle 中得到相同的结果。 oracle中find_in设置的替代选项是什么?
此处 ComExgRateDetailLog.NotificationMinute
包含类似“0,15,30,45”的值,因此查询应该类似于
select CASE
WHEN ComExgRateDetailLog.NotificationMinute = '*'
THEN
1
ELSE
IF(FIND_IN_SET(
CAST(
DATE_FORMAT(
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:00'),
'%i') AS SIGNED),
'0,15,20,45') > 0,
1,
0)
END
From ComExgRateDetailLog
最佳答案
不是 MySQL FIND_IN_SET
的完全替代品,但在您的示例情况下(您只需要知道 IF 值是否包含在逗号分隔的集合中)Oracle 的 REGEX_COUNT
使用正则表达式 '^([^,]+,)*your_value(,[^,]+)*$'
将适合。
检查以下 SQL 查询(针对 Oracle)...
带有数字的示例
在集合中搜索数字1
:[1,2,3,4,5,6,11,12,13]
SELECT
CASE WHEN REGEXP_COUNT('1,2,3,4,5,6,11,12,13', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
正确返回1
在集合中搜索数字1
:[111,222,333]。在这种情况下,INSTR 将无法报告阴性。
SELECT
CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
正确返回0
带有字符串的示例
在一组名称中搜索'John'
:
SELECT
CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*John(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
正确返回1
If you want case-sensitive searches, replace the last parameter of REGEXP_COUNT from
'i'
to'c'
as per the documentation).
但是如果您搜索字母'a'
,它将正确返回零(INSTR 将再次失败)。
SELECT
CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*a(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
正确返回0
我知道这个问题很久以前就已经得到了解答,但它在搜索结果中排名很高,并且可能会帮助其他人寻找比 Oracle 的 INSTR
函数简单但更正确的解决方案。
bool 表达式
也可以使用 bool 表达式,例如 OR
或 AND
。
使用OR
的示例如下:
SELECT
CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*(helen|peter)(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
正确返回1
,因为它找到了“peter”(搜索“helen”或“peter”)。
对于AND
,方法有点不同(修改CASE表达式而不是正则表达式):
SELECT
CASE WHEN
REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*john(,[^,]+)*$', 1, 'i') > 0 AND
REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*peter(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
上述查询搜索“john”AND“peter”。通过在 CASE
语法中复制 REGEXP_COUNT
表达式,可以轻松实现 AND
运算,但性能会受到较小的影响。
关于oracle - Oracle中mysql的Find_in_set的替代方案是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28942608/