Что означает этот SQL-запрос, заменяющий текст JSON? - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь понять часть SQL-запроса, но я не знаю, для чего он используется;кто-нибудь может мне помочь?

Я знаю, что он хочет что-то заменить, но что такое "": "(. +)"", и почему можно использовать строку типа" store "в подстроке ()?

replace((
    CASE 
        WHEN(char_length(substring(xxx_json::text FROM 'Name":"(.+)" , "store')) > 0) 
        THEN substring(xxx_json::text FROM 'Name":"(.+)" , "store')
        ELSE substring(xxx_json::text FROM 'Name":"(.+)" , "employees') 
    END),'\u0016','''')

1 Ответ

0 голосов
/ 13 июня 2018

Похоже, это вариант подстроки, которая выполняет сопоставление с регулярным выражением.Первый аргумент xxx_json::text - это строка для поиска.Второй аргумент - это регулярное выражение для сопоставления.

Обратите внимание, что второй аргумент состоит из всего строкового литерала SQL 'Name":"(.+)" , "store' (в первых двух случаях).Все в этой строке, кроме (.+), должно буквально соответствовать части строки, которую нужно искать.(.+) - это синтаксис регулярных выражений.Точка соответствует любому символу;+ означает одно или несколько вхождений;скобки определяют это как группу захвата.В этом контексте текст, соответствующий группе захвата, - это то, что будет возвращено подстрокой.

Так, например, если содержимое искомой строки было простым выражением JSON, например: { "Name":"John Smith" , "store":"London" },регулярное выражение совпадало бы, и подстрока возвращала бы 'John Smith'.

Короче говоря, это немного хакерский способ синтаксического анализа JSON в SQL для извлечения значения элемента Name (или некоторого элемента, ключ которого заканчивается на Name).

Подробную документацию по этой форме подстроки см. В разделе 9.7.3 в https://www.postgresql.org/docs/9.4/static/functions-matching.html.

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