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

标签 oracle

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/

相关文章:

c# - 为什么我无法执行存储过程? (OracleException 被捕获)

oracle - 在 UTF-8 session 中从 SAS 读取 Oracle 数据 - 字符丢失重音

oracle - 什么是 PLSQL 中的 RESULT 关键字?

oracle - 监听器拒绝连接,并出现以下错误 : ORA-12505, TNS:监听器当前不知道连接描述符中给出的 SID

sql - 如何在另一个 SQL 语句中使用输出

oracle - 如何使用 Oracle 作为嵌入式数据库在 maven 中运行单元测试?

sql-server - 不同数据库中的位图索引支持

oracle - 创建 Oracle 存储过程并从 .sql 文件执行它

sql - Oracle 多列索引与单列索引

javascript - 我的 PHP/PDO 查询本应返回 9 条记录,但只返回 7 条记录