Используя “If” внутри triggers

Я считаю созданным trigger для того, чтобы он подобрал принятую в доме стоимость, это связал с другим table и это изменил. Эта стоимость может быть достаточно свойственной, а следовательно я это ищу в двух полях и кроме того прилагая это:

create or replace TRIGGER "INTER_AGENTE" 
BEFORE INSERT OR UPDATE
ON intercambios
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
SELECT ag_nombre INTO :NEW.int_vendedor 
FROM agentes 
WHERE ag_denominacion like concat(:NEW.int_vendedor,'%') 
      or :NEW.int_vendedor like concat(ag_nombre, '%');

Это функционирует правильно во всех случаях кроме в одном, что я получаю ошибку, так как он находит совпадения в двух реестрах, в различных полях.

Найди стоимость, которая похожа в ag_denominacion в ag_nombre = "CASO1", но также найди стоимость, которая на него похожа в ag_nombre, и тогда он вошел бы ag_nombre = "CASO2".

Мне случается давать предпочтения, а именно, если находит совпадение с ag_denominacion так как, что оставил себе эту. Если он не находит ничего, что искало бы в ag_nombre.

Как véis? Возможно?

1
задан 15.12.2016, 03:16
2 ответа

Пробуй с top 1 меняя это:

SELECT ag_nombre INTO :NEW.int_vendedor 

поэтому:

SELECT top 1 ag_nombre INTO :NEW.int_vendedor 

, Если не, со мной случается tambiГ©n следующего способа:

if(exists(SELECT top 1 ag_nombre FROM agentes WHERE ag_denominacion like concat(:NEW.int_vendedor,'%'))) 
    begin       
        SELECT ag_nombre INTO :NEW.int_vendedor 
        FROM agentes 
        WHERE ag_denominacion like concat(:NEW.int_vendedor,'%');
    end
else
    begin
        SELECT ag_nombre INTO :NEW.int_vendedor 
        FROM agentes 
        WHERE :NEW.int_vendedor like concat(ag_nombre, '%');
    end

TendrГ-Схвати, что санкционировать это я не уверена, но asГ - идет идея.

1
ответ дан 24.11.2019, 14:27

Хотя ты мог делать это с одним IF, этим implicarГ, - когда консультировали таблицу agentes, по крайней мере, 2 раза (или до 3 в зависимости от cГіmo ты это делаешь).

Состоя в том, что говорится о trigger, который стреляет для каждого введенного или измененного реестра таблицы intercambios, лучшего serГ,, - когда несколько раз избегают консультировать таблицу agentes.

Поэтому, чтобы добиваться того, что ты просишь, но не ухудшая результата, я предлагаю, чтобы ты изменил консультацию используя одну claГєsula ORDER BY, чтобы возвращать в первенстве реестры, которые совпадают с ag_denominacion и потом те, которые совпадают с ag_nombre. Потом ты можешь использовать rownum, чтобы ограничивать результат первым реестром:

SELECT ag_nombre INTO :NEW.int_vendedor
  FROM (SELECT ag_nombre
          FROM agentes
         WHERE ag_denominacion LIKE CONCAT(:NEW.int_vendedor,'%')
            OR :NEW.int_vendedor LIKE CONCAT(ag_nombre, '%')
         ORDER BY CASE WHEN ag_denominacion LIKE CONCAT(:NEW.int_vendedor,'%')
                       THEN 1 ELSE 2 END)
 WHERE ROWNUM = 1;
0
ответ дан 24.11.2019, 14:27