Проблемы с пониманием синтаксиса оператора LIKE - PullRequest
0 голосов
/ 29 января 2020

Я вставил исходный код для извлечения определенного набора данных, и у меня возникла проблема с пониманием одного из битов. Вот часть запроса:

WHERE r LIKE 
((COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) ,'.* coronavirus .*|.* SARS .*', 'si')

Не могли бы вы помочь мне перевести, что означает внутренняя скобка этого оператора LIKE? Большое спасибо заранее.

Ответы [ 4 ]

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

COALESCE принимает второй аргумент, если первый равен NULL.

Итак, позвольте мне воспользоваться несколькими возможностями:

  • ur.title равно NULL, urd.reviewtext равно 'review, тогда (COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) оценивается как: review ,

  • , если оба значения NULL, тогда ((COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) оценивается как ','

  • ur.title равно title, urd.reviewtext равно 'review, тогда (COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) оценивается как: title review ,

Теперь, после (COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, ''))(COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) здесь нет оператора конкатенации, поэтому трудно догадаться, что здесь происходит, это синтаксическая ошибка.

Похоже, вы хотите сравнить с несколькими значениями, но это не сработает. Вы должны написать что-то вроде:

LIKE (COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) OR
LIKE '.* coronavirus .*|.* SARS .*' OR
LIKE 'si'

Во-первых, как я сказал, у меня нет подстановочных знаков или каких-либо регулярных выражений, определяющих c частей, поэтому он сравнивается буквально. То же относится и к последнему предложению si, поэтому оно будет соответствовать буквально si.

Во втором предложении '.* coronavirus .*|.* SARS .*' есть регулярное выражение, определяющее c части как .*, но это не так. Поддерживается в SQL регулярном выражении. Это обычно соответствует нулю или более любых символов. У вас также есть |, что является изменением. Но, опять же, он не будет работать, поскольку SQL не поддерживает полное регулярное выражение.

РЕДАКТИРОВАТЬ: похоже, что Postgre оператор SIMILAIR TO поддерживает выше регулярное выражение.

0 голосов
/ 29 января 2020

Функция COALESCE в SQL используется, когда в столбце есть возможность вернуть нулевое значение. Функция меняет ноль на желаемую замену. Пример: COALESCE (title, '') => изменит любые нулевые данные на ''.

В этом конкретном случае не работает, потому что функция LIKE используется во многих столбцах. Вам нужно => ГДЕ x НРАВИТСЯ y или x НРАВИТСЯ z

0 голосов
/ 29 января 2020

ГДЕ r НРАВИТСЯ ((COALESCE (ur.title, '') || '' || COALESCE (urd.reviewtext, '')), '. * Coronavirus. |. SARS. * ',' Si ')

WHERE r LIKE ( ( COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')
               ) ,
               '.* coronavirus .*|.* SARS .*',
               'si'
             )

Синтаксическая ошибка гарантирована как в MySQL, так и в PostgreSQL.

0 голосов
/ 29 января 2020
WHERE r LIKE 
((COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) ,'.* coronavirus .*|.* SARS .*', 'si')

1. COALESCE(ur.title, '') - coalesce function to give first not null value.
2. || ' ' || - to concat space with CONCAT function output.
3. COALESCE(urd.reviewtext, '') - coalesce function to give first not null value.

...