मेरे पास एक क्वेरी और एक लौटा हुआ मान है जो इस तरह दिखता है:

select properties->>'text' as snippet from table where id = 31;

snippet
                                                                                                                                                                                                                                                                                                                                                                                   
-----------------------------------
 There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.
(1 row)

जैसा कि मैं अपनी क्वेरी के आधार पर उम्मीद करता हूं यह लौटाता है।

क्या कोई तरीका है कि मैं लौटाए गए टेक्स्ट को केवल स्थिति 5 से स्थिति 8 तक शब्दों को वापस करने के लिए टुकड़ा कर सकता हूं उदाहरण के लिए? या वैकल्पिक रूप से, चरित्र की स्थिति से टुकड़ा करें जिसे मैं वर्कअराउंड के रूप में उपयोग कर पाऊंगा?

मैंने उपयोग करने की कोशिश की है:

select properties->>'text'[0:13] as snippet from table where id = 31;

जिसकी मुझे आशा थी कि वह वापस आएगा: There are many लेकिन यह काम नहीं किया है।

क्या यह संभवतः एक जेसनबी टेक्स्ट फ़ील्ड को टुकड़ा करने के लिए है?

0
nimgwfc 4 जिंदा 2021, 14:12
1
"Jsonb टेक्स्ट फ़ील्ड" के बारे में कुछ खास नहीं है। properties->>'text' का परिणाम पहले से ही text प्रकार का मान है, और आप ज्ञात स्ट्रिंग प्रोसेसिंग फ़ंक्शन
 – 
Bergi
4 जिंदा 2021, 14:45

1 उत्तर

सबसे बढ़िया उत्तर

"स्लाइस बाय कैरेक्टर पोजीशन" के लिए, आप बस substr() फ़ंक्शन का उपयोग कर सकते हैं:

select substr(properties->>'text', 1, 15) as snippet 
from the_table 
where id = 31;

यदि आप वास्तव में "शब्द" चाहते हैं, तो आप टेक्स्ट को एक सरणी में विभाजित कर सकते हैं उदा। regexp_split_to_array। एक बार आपके पास एक सरणी हो जाने के बाद, आप स्लाइस सिंटैक्स का उपयोग कर सकते हैं:

select (regexp_split_to_array(properties->>'text','\s+'))[5:8] as snippet 
from the_table 
where id = 31;

यह एक सरणी देता है, यदि आप इसे एक स्ट्रिंग के रूप में चाहते हैं, तो आप array_to_string() का उपयोग कर सकते हैं

select array_to_string((regexp_split_to_array(properties->>'text','\s+'))[5:8],' ') as snippet 
from the_table 
where id = 31;

यदि आपको अक्सर इसकी आवश्यकता होती है, तो मैं इसे एक समारोह में लपेट दूंगा:

create function extract_words(p_input text, p_start int, p_end int)
  returns text
as
$$
  select array_to_string((regexp_split_to_array(p_input,'\s+'))[p_start:p_end],' ');
$$  
language sql
immutable;

फिर क्वेरी को पढ़ना बहुत आसान है:

select extract_words(properties->>'text', 5, 8) as snippet 
from the_table 
where id = 31;
1
a_horse_with_no_name 4 जिंदा 2021, 14:44