gpt4 book ai didi

oracle - Oracle中mysql的Find_in_set的替代方案是什么

转载 作者:行者123 更新时间:2023-12-02 04:23:03 27 4
gpt4 key购买 nike

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 表达式,例如 ORAND

使用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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com