Использование регистра WHEN для извлечения с первым символом - PullRequest
1 голос
/ 28 мая 2020

Я использую case как оператор if else в моей базе данных улья, кажется, он не показывает, что я пытаюсь извлечь как.

Я использую этот скрипт

case when substr(file_name, length(file_name) - 44 , 1) like '%_' then substr(file_name, length(file_name) - 44 , 9) else substr(file_name, length(file_name) - 45 , 9) END

в логической концепции, если символ 44 начинается с _, подстрока с 45, иначе подстрока с 45

например (таблица выглядит так)

it is extracting the data from column file name which is 
row_1| abcdefghijklmn_20171120_
row_1| abcdefghijklmn_20181130_
row_1| abcdefghijklmno_20171120_

this is what it returns 
20171120
20181130
_20190721

it should return as this without _ character
20171120
20181130
20190721

правильно ли я использую оператор Like?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

В операторе SQL LIKE символ «%» означает «соответствие чему угодно или ничего», а «_» означает любой одиночный символ. Заключение любого из этих символов в квадратные скобки позволяет их избежать.

Итак, когда вы говорите что-то LIKE '%_', это будет интерпретироваться как «любой символ или ничего и заканчивается одним символом». По сути, это просто проверка, составляет ли длина строки не менее 1.

Если вы пытаетесь сопоставить строки с префиксом с буквальным подчеркиванием, вы захотите избежать подчеркивание и измените его на LIKE '[_]%'. (Это означает «начинается буквально с одного подчеркивания, за которым следует что-нибудь или ничего».)

Надеюсь, это поможет! :) [Отредактировано в соответствии с комментарием jarlh к подстановочному знаку _. Спасибо!]

1 голос
/ 28 мая 2020

Один из способов - заменить значение:

replace(case when substr(file_name, length(file_name) - 44 , 1) like '%_'
           then substr(file_name, length(file_name) - 44 , 9)
           else substr(file_name, length(file_name) - 45 , 9) END
        end, '_', '')

Однако, я думаю, regexp_extract() может быть проще:

regexp_extract(file_name, '^.{44}_?([0-9]{8})', '1')

Шаблон может быть проще, если есть только одна последовательность из 8 цифр, окруженных подчеркиванием:

regexp_extract(file_name, '_([0-9]{8})_', '1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...