Я написал длинный запрос SQL UPDATE, объединенный в нескольких таблицах, с целью редактирования / анонимизации старых данных клиентов.В рамках этого процесса я хочу сохранить первый сегмент из всех найденных почтовых индексов Великобритании, поэтому у меня есть этот запрос (в предложении SET запроса UPDATE):
oh.postcode = IF(oh.country = 'United Kingdom',
IF(@cPos:=LOCATE(' ', TRIM(oh.postcode) > 0),
SUBSTRING(UPPER(TRIM(oh.postcode)),
0,
@cPos - 1),
TRIM(REVERSE(SUBSTRING(REVERSE(UPPER(TRIM(oh.postcode))),
4)))),
LEFT(LTRIM(oh.postcode), 2)),
(«о» это простотаблица псевдоним) вопрос, почему это работает?Я обращаю ваше внимание на вторую строку, которая, как я ожидаю, будет:
IF(@cPos:=LOCATE(' ', TRIM(oh.postcode)) > 0,
, поскольку второй аргумент LOCATE () не должен быть логическим выражением ... или даже
IF( ( @cPos:=LOCATE(' ', TRIM(oh.postcode)) ) > 0,
дополнительные скобки вокруг присваивания, чтобы гарантировать смещение строки, а не результат логического выражения ???
Кажется, что здесь происходит что-то странное, или я не до конца понимаюправила синтаксиса и ассоциативности здесь ... кто-нибудь может объяснить, что происходит?
Я не ищу переписывания здесь, хотя, если кто-нибудь знает лучший способ сделать это, я был бы счастлив узнать что-то,то, что я ищу, - это более глубокое понимание того, почему оригинальный запрос работает, когда он не выглядит так, как должен.в пространстве часть этого запроса никогда не выполняется, и он всегда просто прерывает 3 символа до конца, конечно, я не заметил этого для начала, так как конечный результат выглядит одинаково ... I realise это не является частью первоначального вопроса, но я бы приветствовал любые предложения о том, как правильно добиться этого ...
EDIT2
Это работает:
SET @pc = ' W1s 3NW';
SELECT
IF(@cPos:=LOCATE(' ', TRIM(@pc)),
SUBSTRING(UPPER(TRIM(@pc)),
1,
@cPos - 1),
TRIM(REVERSE(SUBSTRING(REVERSE(UPPER(TRIM(@pc))),
4))));
мне кажется, я забыл о строках mysql с индексом на основе 1 ...