postgres 截取github pr字符串

sql截取字符串這么奇怪的需求?
原因是我們的pr和master build每次運(yùn)行都會(huì)產(chǎn)生大量的數(shù)據(jù)。我們將這部分?jǐn)?shù)據(jù)存在關(guān)系型數(shù)據(jù)庫(kù)里。為了日后方便進(jìn)行統(tǒng)計(jì)和甄別pr的質(zhì)量,是否引入regression。
由于pr采用的是webhook的方式,定制化了各種觸發(fā)的參數(shù),比如:run,run-ui, build等等。一旦用戶輸入了這幾種comment,jenkins就會(huì)自動(dòng)運(yùn)行構(gòu)建腳本。與此同時(shí),我們也將用戶的行為記錄下來(lái)。
研究過(guò)github api的人一定知道,api中攜帶了大量的信息,包括pr的owner,組織,reviewer等等。雖然是json格式的。我們存儲(chǔ)的時(shí)候,還是一股腦的存的text。一方面是快捷,而且不需要過(guò)多的考慮占用的字段長(zhǎng)度。雖然存儲(chǔ)的時(shí)候開心了,但是當(dāng)我們想把其中的數(shù)據(jù)抽取出來(lái)的時(shí)候Orz,太難受了。巨長(zhǎng)的json串還是array類型的。
沒(méi)有辦法,無(wú)法使用postgres自帶的解析json串的函數(shù),具體可參考http://www.postgres.cn/docs/12/datatype-json.html
我們的問(wèn)題在于,怎樣從一堆巨長(zhǎng)的json串中,摳出我們想要的comment。沒(méi)辦法,截取字符串吧。

position 函數(shù),SELECT POSITION('Tutorial' IN 'GeeksForGeeks Tutorial');

簡(jiǎn)單用法就是在字符串里找出我需要截取的值。 類似于如下

image.png

我的json由于比較大,且是一個(gè)數(shù)組串,根據(jù)一般的key來(lái)獲取值,并不能達(dá)到要求。因?yàn)閗ey可能都是一樣的name。
所以我們通過(guò)識(shí)別性比較大的值:ghprbCommentBody,其中一部分信息是這樣的:

{"name":"ghprbCommentBody","value":"run only-build"},

且value的值是動(dòng)態(tài)變化的。
因此可以通過(guò)position來(lái)截取。首先定位到ghprbCommentBody,

            POSITION (
            'ghprbCommentBody' IN b."parameters"
            ) FOR 50

取出長(zhǎng)度為50。
然后拿到了小部分的值,再在這個(gè)基礎(chǔ)上進(jìn)一步截取,

image.png

會(huì)發(fā)現(xiàn)結(jié)果變成這樣

image.png

接下來(lái)就需要對(duì)子串進(jìn)行截取,去除引號(hào),以及不相關(guān)的鍵值。

TRIM (
        TRAILING '"'
        FROM
            TRIM (
                LEADING ':"'
                FROM
                    TRIM (
                        LEADING '"ghprbCommentBody","value"'
                        FROM
                            SUBSTRING (
                                b."parameters"
                                FROM
                                    POSITION (
                                        '"ghprbCommentBody' IN b."parameters"
                                    ) FOR POSITION (
                                        '}' IN SUBSTRING (
                                            b."parameters"
                                            FROM
                                                POSITION (
                                                    'ghprbCommentBody' IN b."parameters"
                                                ) FOR 50
                                        )
                                    )
                            )
                    )
            )
    ) AS "parameters"

LEADING 表示從頭部開始。這樣就達(dá)到了我們的預(yù)期

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容