簡體   English   中英

為什么 CASE - WHEN - ELSE 在這一次實例中不能在 pgadmin 中為我工作?

[英]Why is CASE - WHEN - ELSE not working for me in pgadmin in this once instance?

使用 postgres 9.4 並使用 PGAdmin III:我有一個帶有字符字段的模式,該字段可能包含“換行符”(NL),或者可能包含雙空格,或者兩者都不包含。 我需要根據上述因素或 26 個字符的長度將字段分成 3 段。

如果總長度小於或等於 26,我就照原樣復制。 如果它有 NL,那么我將它除以那些。 如果沒有 NL 但它有雙空格,我將它按那些分開。 最后,如果以上都不是,我想把它拆分成 3 個 26 個字符的塊。

對於上下文; 該列是客戶輸入到 3 行框中的數據。 從 4 個字符到 78 個字符。有些使用 NL,有些使用空格將文本推到下一行,有些幸運地使用空格,所以兩者都不用。

這是收集第一行的查詢部分:

CASE WHEN LENGTH(detail) < 27 THEN detail
     WHEN detail LIKE E'%\n%' THEN SPLIT_PART(detail,E'\n',1)
     WHEN detail LIKE E'%  %' THEN SPLIT_PART(detail,E'  ',1)
     ELSE LEFT(detail, 26)
END AS line1, 

當我在示例模式上對此進行測試時,前三個部分完全按照我的需要工作,但“ELSE”部分永遠不會。 LEFT 語句在 CASE 語句之外而不是在其內部。

我試過用 SELECT 子句將它括起來,嵌套幾個 CASE-WHEN-ELSE 語句,以及其他無濟於事的東西。

奇怪的是,如果我取出引用“% %”的“SPLIT_PART”行,它確實有效。

沒有放棄雙空格拆分,是否有其他解決方案,或者我只是格式化了錯誤?

CASE WHEN LENGTH(detail) < 27 THEN detail
     WHEN detail LIKE '%\n%' THEN  SPLIT_PART(detail,'\n',1)
     WHEN  position(' ' in detail) > 0 THEN SPLIT_PART(detail,' ',1)
     ELSE left(detail,26)

又折騰了一會兒,我懷疑LIKE E'% %'可能是問題所在——事實確實如此。 只需將它更改為LIKE E' '就可以讓它像我想要的那樣工作。

補充:事實證明,最好的解決方案是結合“position”來確定是否存在雙倍空間,以及在該位置正確分離的 split-part。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM