postgresql - पाठ क्षेत्र के भीतर एक स्ट्रिंग के सभी उदाहरणों को बदलें


213

Postgresql में, मैं एक डेटाबेस कॉलम के भीतर स्ट्रिंग के सभी उदाहरणों को कैसे बदलूं?

मैं के सभी उदाहरणों को बदलना चाहते कहो catसाथ dogउदाहरण के लिए,।

ऐसा करने का सबसे अच्छा तरीका क्या है?


7
यदि googling विफल हो जाता है, तो मैन्युअल आज़माएं: postgresql.org/docs/current/static/functions-string.html
a_horse_with_no_name

जवाबों:


404

आप postgresql की जगह फ़ंक्शन का उपयोग करना चाहते हैं :

replace(string text, from text, to text)

उदाहरण के लिए :

UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')

हालाँकि, अवगत रहें, कि यह एक स्ट्रिंग-टू-स्ट्रिंग प्रतिस्थापन होगा, इसलिए 'श्रेणी' 'dogegory' बन जाएगी। regexp_replace फ़ंक्शन आपको जो बदलना चाहते हैं उसके लिए एक सख्त मैच पैटर्न को परिभाषित करने में मदद कर सकता है।


4
हाय दोस्तों, मुझे आपका जवाब और स्पष्टीकरण पसंद है, यह वास्तव में मददगार है। क्या आप regexp_replace का उपयोग करके एक उदाहरण जोड़ सकते हैं? धन्यवाद!
विम फीजेन

1
बेहतर ग्रैन्युलैरिटी के लिए, आप उपयोग कर सकते हैंregexp_replace
डीआरएस

83

रेगुलर एक्सप्रेशन वे

यदि आपको सख्त प्रतिस्थापन मिलान की आवश्यकता है, तो PostgreSQL का regexp_replaceकार्य POSIX नियमित अभिव्यक्ति पैटर्न का उपयोग करके मेल कर सकता है। इसमें सिंटैक्स regexp_replace (स्रोत, पैटर्न, प्रतिस्थापन [, झंडे]) है

मैं क्रमशः झंडे iऔर gकेस-असंवेदनशील और वैश्विक मिलान के लिए उपयोग करूंगा । मैं किसी शब्द की शुरुआत और अंत का क्रमशः उपयोग \mऔर \Mमिलान भी करूंगा ।

रेगेक्स प्रतिकृति को निष्पादित करते समय आमतौर पर काफी कुछ गोच होते हैं। आइए देखें कि बिल्ली को कुत्ते से बदलना कितना आसान है ।

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog');
-->                    Cat bobdog cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'i');
-->                    dog bobcat cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'g');
-->                    Cat bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'gi');
-->                    dog bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat', 'dog', 'gi');
-->                    dog bobcat dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat\M', 'dog', 'gi');
-->                    dog bobdog dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat\M', 'dog', 'gi');
-->                    dog bobcat dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat(s?)\M', 'dog\1', 'gi');
-->                    dog bobcat dog dogs catfish

इतना सब होने के बाद भी कम से कम है एक अनसुलझी स्थिति है। उदाहरण के लिए, "कैट" से शुरू होने वाले वाक्यों को लोअर-केस "डॉग" से बदल दिया जाएगा जो वाक्य कैपिटलाइज़ेशन को तोड़ते हैं।

वर्तमान PostgreSQL की जाँच करें सभी विवरणों के लिए पैटर्न मिलान डॉक्स देखें।

प्रतिस्थापन पाठ के साथ पूरे कॉलम को अपडेट करें

मेरे उदाहरणों को देखते हुए, शायद सबसे सुरक्षित विकल्प होगा:

UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');

30

आप replaceफ़ंक्शन का उपयोग कर सकते हैं

UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')

फ़ंक्शन की परिभाषा इस प्रकार है ( यहाँ से प्राप्त ):

replace(string text, from text, to text)

और संशोधित पाठ लौटाता है। आप इस sql फिडेल को भी देख सकते हैं ।


0

यहाँ एक उदाहरण है जो नियमित अभिव्यक्ति का उपयोग कर अंडरस्कोर के साथ एक कॉलम में 1 या अधिक श्वेत अंतरिक्ष वर्णों के सभी उदाहरणों को बदलता है -

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;

"एस" से पहले केवल एक बैकस्लैश की जरूरत है मुझे लगता है
मार्टी नील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.