SQL स्ट्रिंग में एम्परसेंड चरित्र को बचाना


143

मैं अपने sql डेटाबेस में नाम से एक निश्चित पंक्ति को क्वेरी करने की कोशिश कर रहा हूं और इसमें एक एम्परसैंड है। मैंने एक एस्केप कैरेक्टर सेट करने की कोशिश की और फिर एम्परसेंड से बच गया, लेकिन किसी कारण से यह काम नहीं कर रहा है और मैं अनिश्चित हूं कि वास्तव में मेरी समस्या क्या है।

Set escape '\'
    select * from V1144engine.T_nodes where node_id in(
    select node2_id from V1144engine.T_edges where node1_id in(
    select node2_id from V1144engine.T_edges where node1_id in(
    select node2_id from V1144engine.T_edges where node1_id = 
      (select node_id from V1144engine.T_nodes where node_name = 'Geometric Vectors \& Matrices')))
    and edge_type_id = 1)
    and node_type_id = 1
    and node_id in (
    select node2_id from V1144engine.T_edges where node1_id =
      (select node_id from V1144engine.T_nodes where node_name = 'Algebra II')
    and edge_type_id = 2);

हालाँकि इस सवाल का एक समान समाधान है , समस्याओं को बहुत अलग तरीके से प्रस्तुत किया गया है। वे एक ही समाधान होने का अंत कर सकते हैं, लेकिन इसका मतलब यह नहीं है कि प्रश्न समान हैं।


मुझे नहीं लगता कि आपको भागने के लिए ('\') चरित्र के आसपास की आवश्यकता है
mcalex

29
set define offयह करने का सबसे सरल तरीका है।
अनीबस

जवाबों:


205

के बजाय

node_name = 'Geometric Vectors \& Matrices'

उपयोग

node_name = 'Geometric Vectors ' || chr(38) || ' Matrices' 

38 एम्परसेंड के लिए एएससीआई कोड है, और इस रूप में इसे एक स्ट्रिंग के रूप में व्याख्या की जाएगी, और कुछ नहीं। मैंने इसे आजमाया और यह काम आया।

एक और तरीका 'और' चरित्र के बजाय LIKE और एक अंडरलाइन का उपयोग किया जा सकता है:

node_name LIKE 'Geometric Vectors _ Matrices' 

मौका है कि आप कुछ अन्य रिकॉर्ड भी पाएंगे, जो केवल इस एक चरित्र में अलग है, काफी कम है।


45
अचिन्त्य के बजाय chr(38), आप कर सकते हैंnode_name = 'Geometric Vectors &' || ' Matrices'
जे सुलिवन

1
अन्य ग़रीब भ्रमित आत्माओं के लिए अपने आप को एक जैसा समझें, ध्यान दें कि यह है chr(38), नहीं char(38)
xdhmoore

ध्यान दें कि &MySQL में भागने की आवश्यकता नहीं है। इसके अलावा MySQL फ़ंक्शन नहीं है CHR()
अस्माइर

113

एस्केप \डिफ़ॉल्ट रूप से सेट है , इसलिए आपको इसे सेट करने की आवश्यकता नहीं है; लेकिन अगर आप ऐसा करते हैं, तो इसे उद्धरणों में न लपेटें।

Ampersand SQL * Plus प्रतिस्थापन चर है; लेकिन आप इसे बदल सकते हैं , या आपके मामले में अधिक उपयोगी इसे पूरी तरह से बंद कर सकते हैं:

set define off

तब आपको मूल्य से बचने की जहमत उठाने की जरूरत नहीं है।


2
बच चरित्र\ डिफ़ॉल्ट रूप से सेट है , लेकिन बूलियन पैरामीटर escapeडिफ़ॉल्ट रूप से बंद पर सेट है। तो ओपी को भागने के चरित्र को सेट करने की आवश्यकता नहीं हो सकती है, लेकिन उसे SET ESCAPE ONकाम करने के लिए कम से कम की जरूरत है । या, ज़ाहिर है, किसी भी अन्य का उपयोग करें, बेहतर समाधान।
गणितगुप्त

46

आप उपयोग कर सकते हैं

set define off

इसका उपयोग करते हुए यह इनपुट के लिए संकेत नहीं देगा


32

ओरेकल एसक्यूएल फंडामेंटल बुक से सीधे

SET DEFINE OFF
select 'Coda & Sid' from dual;
SET DEFINE ON

कैसे कोई इसे परिभाषित किए बिना बच जाएगा।


2
SET DEFINE ON का योग सहायक है।
केएसवी

@ रमन परिभाषित किए बिना आप उपयोग कर सकते हैं: दोहरे से 'कोडा' और 'सिड' का चयन करें; (डबल सिंगल कोट्स)
जूल

8

भागने के लिए &आप निम्नलिखित तरीके आजमा सकते हैं: -

  1. set scan off
  2. set define off
  3. set escape on तब की जगह &से/&
  4. &द्वारा प्रतिस्थापित करें&&

उनमें से एक को कम से कम काम करना चाहिए।

एक ddally यदि आप PL / SQL डेवलपर का उपयोग कर रहे हैं तो sql विंडो के नीचे & आइकन है कृपया वहां जाएं और इसे अक्षम करें । पुराने संस्करण में नोट यह विकल्प मौजूद नहीं है।

यह भी सुनिश्चित करें कि सेट डिफाइन को स्क्रिप्ट की बहुत शुरुआत में लिखा गया है।


2

यह भी काम करता है:

select * from mde_product where cfn = 'A3D"&"R01'

आप &संलग्न के रूप में शाब्दिक रूप से परिभाषित करते हैं "&", स्ट्रिंग में डबल qoutes के साथ है ।


1
यदि आप ऐसा करते हैं, तो डबल-कोट्स स्ट्रिंग का हिस्सा बन जाएंगे, जैसे कि:A3D"&"R01
डेविड बालैसिक

2
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

या वैकल्पिक रूप से:

set define off
... node_name = 'Geometric Vectors & Matrices' ...

पहले आपको & से बचने के लिए बैकस्लैश का उपयोग करने की अनुमति देता है।

दूसरा बंद हो जाता है और "विश्व स्तर पर" (कहीं भी बैकस्लैश जोड़ने की आवश्यकता नहीं है)। आप इसे फिर से चालू कर सकते हैं set define onऔर उस लाइन से एम्परसैंड्स पर उनका विशेष अर्थ वापस आ जाएगा, इसलिए आप इसे स्क्रिप्ट के कुछ हिस्सों के लिए बंद कर सकते हैं और दूसरों के लिए नहीं।



0

मैंने INSERT के भीतर "&" खोजने और बदलने में मदद के लिए एक रेगेक्स लिखा, मुझे उम्मीद है कि यह किसी की मदद करता है।

चाल यह सुनिश्चित करने के लिए थी कि "और" अन्य पाठ के साथ था।

खोज “(\'[^\']*(?=\&))(\&)([^\']*\')”

बदलने के “$1' || chr(38) || '$3”

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