SQL, Postgresql: сокращение для нескольких условий ИЛИ, содержащих position ()

Если каждый ожидаемый параметр является строкой, api-версия пропустила кавычки!

string requestData = string.Format("{{\"api_version\":\"{0}\",\"method\":\"{1}\",\"merchant_account\":\"{2}\",\"merchant_password\":\"{3}\",\"transaction_unique_id\":\"{4}\",\"amount\":{5},\"currency\":\"{6}\",\"callback_url\":\"{7}\",\"user_id\":\"{8}\",\"user_ip\":\"{9}\",\"user_email\":\"{10}\",\"card\":{{\"card_number\":\"{11}\"}}}}", apiVersion, method, merchantAccount, merchantPassword, transactionId, amount, currency, callbackUrl, id, ip, mail, cardNumber);

Редактировать: я не заметил отсутствующего double {}, когда вы используете строковый формат, вы должны удвоить каждый { или }, чтобы избежать его

1
задан Ray Zhang 19 January 2019 в 16:19
поделиться

2 ответа

Вы всегда можете объединить строки и использовать их как один аргумент:

SELECT * FROM table WHERE
 POSITION('x' in (field1 || field2 || field3) ) > 0

Обратите внимание, что это объединение с || даст вам значение NULL, если любое из полей field1, field2, field3 имеет значение null, а конкатенация с функцией concat не будет:

SELECT * FROM table WHERE
 POSITION('x' in concat(field1, field2, field3) ) > 0

Если вы ищете один символ, это будет хорошо. Однако, если вы ищете, например, «ax», и вы не хотите совпадать, если field1 оканчивается на «a», а field2 начинается с «x», тогда вы также можете включить разделитель между аргументами с помощью функции concat_ws, например:

0
ответ дан George S 19 January 2019 в 16:19
поделиться

Я не знаю собственного способа сделать это, но вы могли бы легко обернуть его в функцию. Исходя из вашего комментария о том, что вы, возможно, захотите применить это к другим функциям, он будет масштабируемым, поскольку вы сможете сохранить шаблон - цикл внутри функции - на месте и изменить логику оценки в соответствии с вашими будущими потребностями. [112 ]

Он также применяется с коротким замыканием, в том случае, когда он находит положительное значение, он выходит без оценки всего остального без необходимости.

CREATE OR REPLACE FUNCTION any_position(search_text text, variadic text_values text[])
  RETURNS integer AS
$BODY$
  declare
    element text;
    pos integer;
  begin
    foreach element in array text_values
    loop
      pos := position (search_text in element);
      if pos > 0 then
        return pos;
      end if;
    end loop;

    return 0;
  end;
$BODY$
  LANGUAGE plpgsql;

Пример вызова:

select any_position ('x', 'Five', 'Six', 'Seven')
0
ответ дан Hambone 19 January 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: