2015-03-09 2 views
0
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. Что такое альтернативный вариант find_in, установленный в oracle?Что является альтернативой Find_in_set mysql в Oracle

Здесь 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 
+1

редизайны базы данных. – Jens

ответ

1
select FIND_IN_SET('15', '0,15,20,45') from dual would return 2 

Для того, чтобы достичь этого в оракула использовать функцию INSTR, но INSTR не совсем то же, что FIND_IN_SET. INSTR рассматривает запятую, пробел, что-то внутри строки как символ.

SELECT INSTR ('0,15,20,45', '15',1,1) FROM dual would return 3 

Вы можете прочитать о INSTR here.

+1

Эти функции не похожи: 'INSTR ('0,115,20,45', '15', 1,1)' будет возвращать '4' (поскольку' 15' - это подстрока, начинающаяся с индекса 4), но в MySQL 'FIND_IN_SET ('15', '1,115,20,45') 'будет возвращать' 0' (поскольку '15' не является элементом списка с разделителями-запятыми). – MT0

1
CREATE OR REPLACE FUNCTION find_in_set(
    i_value IN VARCHAR2, 
    i_list IN VARCHAR2, 
    i_delim IN VARCHAR2 DEFAULT ',' 
) RETURN INT DETERMINISTIC 
AS 
    p_result  INT  := 0; 
    p_start  NUMBER(5) := 1; 
    p_end   NUMBER(5); 
    c_len CONSTANT NUMBER(5) := LENGTH(i_list); 
    c_ld CONSTANT NUMBER(5) := LENGTH(i_delim); 
BEGIN 
    IF c_len > 0 THEN 
    p_end := INSTR(i_list, i_delim, p_start); 
    WHILE p_end > 0 LOOP 
     p_result := p_result + 1; 
     IF (SUBSTR(i_list, p_start, p_end - p_start) = i_value) 
     THEN 
     RETURN p_result; 
     END IF; 
     p_start := p_end + c_ld; 
     p_end := INSTR(i_list, i_delim, p_start); 
    END LOOP; 
    IF p_start <= c_len + 1 
     AND SUBSTR(i_list, p_start, c_len - p_start + 1) = i_value 
    THEN 
     RETURN p_result + 1; 
    END IF; 
    END IF; 
    RETURN 0; 
END; 
/
Смежные вопросы