skip to Main Content

I have quite a few procedures that rely on performing different queries based on the value of certain config variables. For example it’ll be something like

IF (check_unit='Y') THEN
  SELECT my_key, my_id
  INTO l_my_key, l_my_id
  FROM data
  WHERE my_num = NEW.my_num AND
        my_data = NEW.my_date AND
        my_unit = NEW.my_unit;

ELSE
  SELECT my_key, my_id
  INTO l_my_key, l_my_id
  FROM data
  WHERE my_num = NEW.my_num AND
        my_data = NEW.my_date;

This is repeated over and over in multiple procedures across the database. I think there must be an easy way to do an IF or other condition so that if my_unit = ‘Y’ we will do the query with the 2 AND otherwise we will just do the 1 AND command without having to be so explicit writing both full queries out.

I’m still getting used to PL/pgSQL so if there is an easy way to do this I apologize. Any help or direction would be greatly appreciated. If the way it is being done is the standard or accepted way then that’s okay too.

2

Answers


  1. In SQL there is no IF, where is your logical work-horse. So something like:

    select my_key, my_id
      into l_my_key, l_my_id
      from data
     where my_num = new.my_num 
       and my_data = new.my_date 
       and (   new.my_unit  <> 'Y' 
            or ( my_unit = new.my_unit and 
                    new.my_unit  <> 'Y'
                  ) 
              ) ;
    

    However, please describe what you are actually trying to accomplish.

    The above will only work within an insert or update row level trigger function. The pseudo row new exists only in row triggers and new.x will always be NULL on a delete trigger. Further, triggers do not return values (other than a row image or null) and cannot be called directly.

    Login or Signup to reply.
  2. You can easily move the IF condition into a conditional expression in the WHERE to choose your clauses:

    SELECT my_key, my_id
    INTO l_my_key, l_my_id
    FROM data
    WHERE (CASE WHEN check_unit = 'Y'
      THEN my_num = NEW.my_num AND
           my_data = NEW.my_date AND
           my_unit = NEW.my_unit
      ELSE my_num = NEW.my_num AND
           my_data = NEW.my_date
    END);
    

    Then simplify

    SELECT my_key, my_id
    INTO l_my_key, l_my_id
    FROM data
    WHERE my_num = NEW.my_num AND
          my_data = NEW.my_date AND
          (CASE WHEN check_unit = 'Y' THEN my_unit = NEW.my_unit ELSE TRUE END);
    

    and further

    SELECT my_key, my_id
    INTO l_my_key, l_my_id
    FROM data
    WHERE my_num = NEW.my_num AND
          my_data = NEW.my_date AND
          (check_unit <> 'Y' OR my_unit = NEW.my_unit);
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search