Postgres.

У меня есть два столбца (A и B) в таблице 1, и я хочу объединить их в другой столбец (C), только если начало B не является A, и если это не так, просто скопируйте B в C. Ключевым моментом здесь является то, что A и B не имеют фиксированной длины, поэтому я не думаю, что могу использовать left (), так как ему нужна определенная длина. Например:

ID        A                            B 
1          5                          48721
2         98                          98555
3         98                            136
4        841                     8417740313
5        841                         133889

В этом случае столбец C должен включать:

  1. Для ID = 1: 548721
  2. Для ID = 2: 98555
  3. Для ID = 3: 98136
  4. Для ID = 4: 8417740313
  5. Для ID = 5: 841133889

Я пытался:

UPDATE 1
SET C = B
WHERE LEFT (B) = A
UPDATE 1
SET C = concat(A,B)
WHERE LEFT(B) <> A

Но это не работает, так как мне нужно дать left () фиксированную длину. Что бы вы сделали, ребята?

Всего 2 ответа


Кажется, вы хотите что-то вроде этого:

UPDATE t
    SET C = (CASE WHEN B LIKE A || '%' THEN B ELSE A || B END);

То есть вы можете использовать LIKE для сравнения.


Шаг 1:

update table 
set col_c = col_a||substr(col_b,length(col_a))
where 
substr(col_b,1,length(col_a))=col_a;

Шаг 2:

update table 
set col_c = col_a||col_b
where 
substr(col_b,1,length(col_a))<>col_a;

вы можете попробовать это и сообщить нам, что ранее данное решение также верно; но что, если тот же самый пример: 98 в col_a присутствует в середине col_b, а не в начале?


Есть идеи?

10000