Оператор ^
предназначен для возведения в степень в 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
, но, вероятно, это не проблема.