Наличие длинных строк в хранимых процедурах MySql - PullRequest
3 голосов
/ 05 октября 2011

Есть ли способ сделать так, чтобы длинные строки помещались в несколько строк, чтобы при просмотре на экране или распечатке кода было легче читать?

Возможно, я мог бы быть яснее.

Иметь хранимую процедуру со строками типа

   IF ((select post_code REGEXP '^([A-PR-UWYZ][A-HK-Y]{0,1}[0-9]{1,2} [0-9][ABD-HJLNP-UW-Z]{2})|([A-PR-UWYZ][0-9][A-HJKMPR-Y] [0-9][ABD-HJLNP-UW-Z]{2})|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]) [0-9][ABD-HJLNP-UW-Z]{2})$') = 0)

Хотелось бы иметь возможность изменить строку, чтобы я мог просматривать ее в пределах ширины 80 символов. У кого-нибудь есть идеи, как это сделать.

PS: это регулярное выражение для почтовых индексов Великобритании

Ответы [ 2 ]

10 голосов
/ 24 февраля 2012

Например,

-- a very long string in one block
set my_str = 'aaaabbbbcccc';

также можно записать как

-- a very long string, as a concatenation of smaller parts
set my_str = 'aaaa' 'bbbb' 'cccc';

или даже лучше

-- a very long string in a readable format
set my_str = 'aaaa'
             'bbbb'
             'cccc';

Обратите внимание, что пробелы и конец строки междучасти a / b / c являются , а не частью самой строки из-за размещения кавычек.

Также обратите внимание, что строковые данные здесь объединяются парсером, а не по запросувремя выполнения.

Запись чего-то вроде:

-- this is broken
set my_str = 'aaaa 
              bbbb 
              cccc';

приводит к другому результату.

См. также http://dev.mysql.com/doc/refman/5.6/en/string-literals.html

Искать "Помещенные в кавычки строки помещенырядом друг с другом объединяются в одну строку "

0 голосов
/ 05 октября 2011

Вы можете разделить его на передний и задний компоненты почтового индекса, а затем выгрузить весь лот в UDF.

Это сохранит безобразие в одном месте и означает, что вам придется вносить изменения только в один блок кода, когда / если Royal Mail решит изменить формат почтовых индексов Великобритании; -)

Нечто подобное должно сработать:

DELIMITER $$


CREATE FUNCTION `isValidUKPostcode`(candidate varchar(255)) RETURNS BOOLEAN       READS SQL DATA
BEGIN
    declare back varchar(3);
    declare front varchar(10);
    declare v_out boolean;

    set back = substr(candidate,-3);
    set front = substr(candidate,1,length(candidate)-3);
    set v_out = false;

    IF (back REGEXP '^[0-9][ABD-HJLNP-UW-Z]{2}$'= 1) THEN
      CASE 
      WHEN front REGEXP '^[A-PR-UWYZ][A-HK-Y]{0,1}[0-9]{1,2} $' = 1 THEN set v_out = true;
      WHEN front REGEXP '^[A-PR-UWYZ][0-9][A-HJKMPR-Y] $' = 1 THEN set v_out = true;
      WHEN front REGEXP '^[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y] $' = 1 THEN set v_out = true;
      END CASE;
    END IF;

    return v_out;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...