map
является наиболее логичным решением этой проблемы.
let xs = [1, 2, 3];
xs = xs.map(x => 42);
xs // -> [42, 42, 42]
Однако, если есть вероятность, что массив разрежен, вам нужно будет использовать for
или, что еще лучше, for .. of
.
См .:
Вы можете использовать псевдонимы столбцов только в предложениях GROUP BY, ORDER BY или HAVING.
Стандартный SQL не позволяет вам ссылаться на псевдоним столбца в WHERE пункт. Это ограничение накладывается потому что когда код ГДЕ выполнено, значение столбца может еще не
Скопировано из документации MySQL
Как указано в комментариях, использование HAVING вместо этого может сделать работу. Обязательно прочтите это WHERE vs HAVING .
Как заметил Виктор, проблема в псевдониме. Однако этого можно избежать, поместив выражение непосредственно в предложение WHERE x IN y:
SELECT `users`.`first_name`,`users`.`last_name`,`users`.`email`,SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
Однако я полагаю, что это очень неэффективно, поскольку подзапрос должен выполняться для каждой строки внешнего запроса.