2012-12-23 168 views
1

TEXT類型的列tasumma包含行。 評論開始時在行首標記了兩個**字符。從此開始,所有文本到列結尾應該被忽略。 如何在推薦行之前返回文本。例如,如果列包含文本如何在PostgresSQL中的新行和** charactrers之前返回文本

2*31 
** This is multiline 
comment starting with ** characters in start of line 

必須返回2 * 31

我試圖表達

CASE when tasusumma like '%**%' then 
    substring(tasusumma for position('**' in tasusumma)-1) 
else tasusumma end 

,但它看起來有點難看。

Postgres e.q是否有更好的方法?使用正則表達式子字符串?

+1

當tasusumma像'%**%'那麼'是嗎? (額外%) – Bohemian

+0

是的。這是錯誤的。我更新了問題。 – Andrus

回答

0

你可以使用正則表達式提取:

substring(tasusumma from '.*(?=\*\*)') 

這裏的this code running in sqlfiddle

+0

謝謝。期望的結果必須是abc,但它返回** def – Andrus

+0

@Andrus我誤解了這個問題,我修復了正則表達式以返回「abc」。這個答案比目前被接受的答案短,整潔 - 你可能會考慮至少upvoting這一個:) – Bohemian

+0

如果你的答案返回空字符串,如果字符串不包含**和像'x ** y **'這樣的字符串無效。接受的答案在兩種情況下均返回正確的結果。對於第二種情況,正確的結果是'x',但是你的表達式返回'x ** y' – Andrus

0
CREATE TABLE fuzz 
     (id INTEGER NOT NULL PRIMARY key 
     , fuzz varchar 
     ); 

INSERT INTO fuzz (id, fuzz) VALUES 
(1, E'one ** TWO') 
, (2, E'one ** COMMENT\n two.') 
, (3, E'one ** COMMENT\n two.\*\* THREE') 
     ; 

SELECT f.id 
     , regexp_replace (f.fuzz, E'\\*\\*[^\n]*', '' , 'g') 
FROM fuzz f 
     ; 

結果:

NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "fuzz_pkey" for table "fuzz" 
CREATE TABLE 
INSERT 0 3 
id | regexp_replace 
----+---------------- 
    1 | one 
    2 | one   + 
    | two. 
    3 | one   + 
    | two. 
(3 rows) 

Fine Manual 注意:如果你有standard_conforming_strings關閉,您在文本字符串常量寫任何反斜槓需要加倍。有關更多信息,請參見第4.1.2.1節。

注意:與OP請求相反,上面的代碼假設'**'註釋應該在同一行的末尾結束;下一行是而不是被視爲評論的一部分。這是' - '註釋在sql中處理的方式,並且'//'註釋在C或C++中處理。

+0

謝謝。偉大的代碼。然而,問題指出,從**到'列末尾的字符應忽略,所以我標記PinnyM答案爲答案。 – Andrus

+0

對於轉到行尾的註釋,將下一行視爲註釋是正常的。但你可能有不同的要求。 – wildplasser

+0

數據庫文本列包含公式,可能包含多行。公式後,可能會有註釋開始在列的下一行,可能是多行。如果行中的前兩個字符是**,則開始註釋。剩餘的評論行可以以任何字符開頭。我的目標是提取沒有評論的公式。 – Andrus

相關問題