PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL के साथ पिछली जगहों को ट्रिम करें

कई अलग-अलग अदृश्य पात्र हैं। उनमें से कई के पास WSpace=Y . संपत्ति है ("व्हाट्सएप") यूनिकोड में। लेकिन कुछ विशेष पात्रों को "व्हाट्सएप" नहीं माना जाता है और फिर भी उनका कोई दृश्य प्रतिनिधित्व नहीं होता है। स्पेस (विराम चिह्न) और व्हाइटस्पेस वर्णों के बारे में उत्कृष्ट विकिपीडिया लेख आपको एक विचार देना चाहिए।

इस संबंध में यूनिकोड बेकार है:बहुत सारे आकर्षक पात्रों को पेश करना जो मुख्य रूप से लोगों को भ्रमित करने का काम करते हैं।

मानक एसक्यूएल trim() डिफ़ॉल्ट रूप से फ़ंक्शन केवल मूल लैटिन स्पेस कैरेक्टर को ट्रिम करता है (यूनिकोड:U+0020 / ASCII 32)। rtrim() . के साथ भी ऐसा ही है और ltrim() वेरिएंट। आपका कॉल भी केवल उस विशेष वर्ण को लक्षित करता है।

regexp_replace() के साथ रेगुलर एक्सप्रेशन का उपयोग करें इसके बजाय।

अनुगामी

सभी अनुगामी श्वेत स्थान को निकालने के लिए (लेकिन सफेद जगह नहीं अंदर स्ट्रिंग):

SELECT regexp_replace(eventdate, '\s+$', '') FROM eventdates;

रेगुलर एक्सप्रेशन समझाया गया:
\s ... [[:space:]] . के लिए रेगुलर एक्सप्रेशन क्लास शॉर्टहैंड
    - जो व्हाइट-स्पेस वर्णों का समूह है - नीचे सीमाएं देखें
+ ... लगातार 1 या अधिक मैच
$ ... स्ट्रिंग का अंत

डेमो:

SELECT regexp_replace('inner white   ', '\s+$', '') || '|'

रिटर्न:

inner white|

हाँ, यह एक एकल है बैकस्लैश (\ ) इस संबंधित उत्तर में विवरण:

  • एसक्यूएल चुनें कि कॉलम कहां से शुरू होता है \

अग्रणी

सभी प्रमुख रिक्त स्थान को निकालने के लिए (लेकिन स्ट्रिंग के अंदर सफेद जगह नहीं):

regexp_replace(eventdate, '^\s+', '')

^ .. स्ट्रिंग की शुरुआत

दोनों

दोनों को हटाने के लिए , आप फ़ंक्शन कॉल के ऊपर श्रृंखलाबद्ध कर सकते हैं:

regexp_replace(regexp_replace(eventdate, '^\s+', ''), '\s+$', '')

या आप दोनों को एक ही कॉल में दो शाखाओं . के साथ जोड़ सकते हैं .
'g'जोड़ें सभी मैचों को बदलने के लिए चौथे पैरामीटर के रूप में, न कि केवल पहला:

regexp_replace(eventdate, '^\s+|\s+$', '', 'g')

लेकिन यह आमतौर पर substring() . के साथ तेज़ होना चाहिए :

substring(eventdate, '\S(?:.*\S)*')

\S ... सब कुछ लेकिन सफेद स्थान
(?: re ) ... कोष्ठकों का गैर-कैप्चरिंग सेट
.* ... 0-n वर्णों की कोई भी स्ट्रिंग

या इनमें से एक:

substring(eventdate, '^\s*(.*\S)')
substring(eventdate, '(\S.*\S)')  -- only works for 2+ printing characters

( re ) ... कोष्ठकों के सेट को कैप्चर करना

पहले गैर-व्हाट्सएप वर्ण और उपलब्ध होने पर अंतिम गैर-व्हाट्सएप वर्ण तक सब कुछ प्रभावी ढंग से लेता है।

व्हाइटस्पेस?

कुछ और संबंधित वर्ण हैं जिन्हें यूनिकोड में "व्हाट्सएप" के रूप में वर्गीकृत नहीं किया गया है - इसलिए वर्ण वर्ग में शामिल नहीं है [[:space:]]

ये मेरे लिए pgAdmin में अदृश्य ग्लिफ़ के रूप में प्रिंट करते हैं:"मंगोलियन स्वर", "शून्य चौड़ाई स्थान", "शून्य चौड़ाई गैर-जुड़ने वाला", "शून्य चौड़ाई योजक":

SELECT E'\u180e', E'\u200B', E'\u200C', E'\u200D';

'᠎' | '​' | '‌' | '‍'

दो और, दृश्यमान . के रूप में प्रिंट करना pgAdmin में ग्लिफ़, लेकिन मेरे ब्राउज़र में अदृश्य:"वर्ड जॉइनर", "ज़ीरो चौड़ाई नॉन-ब्रेकिंग स्पेस":

SELECT E'\u2060', E'\uFEFF';
'⁠' | ''

अंततः, पात्रों को अदृश्य किया जाता है या नहीं, यह भी प्रदर्शन के लिए उपयोग किए जाने वाले फ़ॉन्ट पर निर्भर करता है।

इन सभी को हटाने के लिए साथ ही, '\s' . को बदलें '[\s\u180e\u200B\u200C\u200D\u2060\uFEFF]' के साथ या '[\s᠎​‌‍⁠]' (अदृश्य वर्णों के पीछे नोट करें!)।
उदाहरण के बजाय:

regexp_replace(eventdate, '\s+$', '')

उपयोग करें:

regexp_replace(eventdate, '[\s\u180e\u200B\u200C\u200D\u2060\uFEFF]+$', '')

या:

regexp_replace(eventdate, '[\s᠎​‌‍⁠]+$', '')  -- note invisible characters

सीमाएं

पॉज़िक्स वर्ण वर्ग भी है [[:graph:]] "दृश्यमान पात्रों" का प्रतिनिधित्व करना चाहिए। उदाहरण:

substring(eventdate, '([[:graph:]].*[[:graph:]])')

यह प्रत्येक सेटअप में ASCII वर्णों के लिए मज़बूती से काम करता है (जहां यह [\x21-\x7E] तक उबलता है) ), लेकिन इससे आगे आप वर्तमान में (पृष्ठ 10 सहित) अंतर्निहित ओएस द्वारा प्रदान की गई जानकारी पर निर्भर हैं (ctype को परिभाषित करने के लिए) ) और संभवतः स्थानीय सेटिंग्स।

कड़ाई से बोलते हुए, हर . के लिए यही स्थिति है एक चरित्र वर्ग के संदर्भ में, लेकिन कम आम तौर पर इस्तेमाल किए जाने वाले लोगों जैसे ग्राफ के साथ अधिक असहमति प्रतीत होती है . लेकिन आपको वर्ण वर्ग में और वर्ण जोड़ने पड़ सकते हैं [[:space:]] (आशुलिपि \s ) सभी व्हाइटस्पेस वर्णों को पकड़ने के लिए। जैसे:\u2007 , \u202f और \u00a0 लगता है @XiCoN JFS के लिए भी गायब है।

मैनुअल:

<ब्लॉककोट>

ब्रैकेट एक्सप्रेशन के भीतर, वर्ण वर्ग का नाम [: . में संलग्न है और :] उस वर्ग से संबंधित सभी पात्रों की सूची के लिए खड़ा है। मानक वर्ण वर्ग के नाम हैं:alnum , alpha , blank , cntrl ,digit , graph , lower , print , punct , space , upper , xdigit .ये ctype में परिभाषित वर्ण वर्गों के लिए खड़े हैं। एक स्थान दूसरों को प्रदान कर सकता है।

बोल्ड जोर मेरा।

पोस्टग्रेज 10 के साथ तय की गई इस सीमा पर भी ध्यान दें:

<ब्लॉककोट>

बड़े कैरेक्टर कोड के लिए रेगुलर एक्सप्रेशन के कैरेक्टर क्लास हैंडलिंग को ठीक करें, विशेष रूप से U+7FF से ऊपर के यूनिकोड कैरेक्टर (टॉम लेन)

पहले, ऐसे पात्रों को स्थानीय-निर्भर वर्ण वर्गों जैसे [[:alpha:]] से संबंधित के रूप में कभी नहीं पहचाना जाता था। ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं अपने मौजूदा रेल ऐप को उसकेोकू पर कैसे स्थानांतरित करूं? (एसक्लाइट पोस्टग्रेज करने के लिए)

  2. डेटाबेस को हटा नहीं सकता

  3. PostgreSQL में एक तिथि से सप्ताह घटाएं

  4. PostgreSQL की छिपी विशेषताएं

  5. ORDER BY के साथ अपडेट करें