Синтаксическая ошибка, возникающая при попытке обновить значение с помощью XOR в Postgresql - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь обновить столбец таблицы salary в моей базе данных Postgres. Сценарий, который я пытаюсь использовать:

UPDATE "LC".sex
SET sex = CHAR(ASCII('f') ^ ASCII('m') ^ ASCII(sex));

Как это работало в MySQL. Однако я получил синтаксическую ошибку:

ERROR:  syntax error at or near "ASCII"
LINE 2:  SET sex = CHAR(ASCII('f') ^ ASCII('m') ^ ASCII(sex));"

Я попытался покопаться и попытать счастья с помощью функции CHR(), а затем получил:

function chr(double precision) does not exist

Я почти дал до тех пор, пока я не попробовал это:

SELECT CHAR(ASCII('f') ^ ASCII('m') ^ ASCII('f'));

И это дало мне ту же синтаксическую ошибку, однако, SELECT CHAR(ASCII('f') ^ ASCII('m'); работает в Postgres. Так что я в тупике. Что я делаю не так?

Спасибо.

1 Ответ

1 голос
/ 30 января 2020

Оператор ^ предназначен для возведения в степень в PostgreSQL, вам нужно # для побитового XOR, подробности см. Математические операторы в подробном руководстве.

Итак Вы могли бы сказать:

update "LC".sex
set sex = chr(ascii('f') # ascii('m') # ascii(sex));

Тем не менее, мне немного любопытно, что вы пытаетесь сделать sh со всеми этими спорами. Если sex равно 'f', тогда вы получите 'm'; если sex равно 'm', тогда вы получите 'f'; если sex равно null, вы получите null; если sex - это что-то еще, тогда вы получите ерунду:

=> select sex, chr(ascii('f') # ascii('m') # ascii(sex))
   from (values ('f'), ('m'), ('F'), ('M'), (null), ('X'), ('y')) t(sex);
 sex | chr 
-----+-----
 f   | m
 m   | f
 F   | M
 M   | F
     | 
 X   | S
 y   | r
(7 rows)

Если вы просто хотите перевернуть пол, почему бы не сказать так:

update "LC".sex
set sex = case lower(sex) when 'f' then 'm' when 'm' then 'f' else null end;

Незначительная модификация сохранит регистр если это проблема. Это преобразует все, кроме 'f', 'F', 'm' и 'M' в null, но, вероятно, это не проблема.

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