2009-10-27 4 views
6

मैं एक आर स्क्रिप्ट में काम कर रहा हूं जो एक लंबे एसक्यूएल स्ट्रिंग का उपयोग करता है, और मैं क्वेरी को अपेक्षाकृत अन्य मार्कअप से मुक्त रखना चाहता हूं ताकि संपादकों और अनुप्रयोगों के बीच प्रतिलिपि बनाने और चिपकाने की अनुमति मिल सके। मैं बेहतर पठनीयता के लिए क्वेरी को लाइनों में विभाजित करने की क्षमता भी पसंद करूंगा।क्या मैं आर आर स्क्रिप्ट में स्वरूपित एसक्यूएल स्ट्रिंग्स को गहन रूप से शामिल कर सकता हूं?

आरओडीबीसी दस्तावेज में, paste फ़ंक्शन का उपयोग अलग-अलग हिस्सों से क्वेरी बनाने के लिए किया जाता है, लेकिन मैं कुछ कम क्लिडी और कम उद्धरण और अल्पविरामों के साथ पसंद करता हूं। आपकी सहायता के लिए धन्यवाद.

उत्तर

7

आप बेहतर स्ट्रिंग concatination वाक्य रचना के लिए% +% ऑपरेटर ओवरराइड कर सकते हैं: आप जिस तरह से एक पुरानी सी प्रोग्रामर वापस आ गए हैं, तो

> cat(query,"\n") 
SELECT DISTINCT x AS somethingorother, 
       y AS y1 
FROM tbl 
WHERE id=%s 
AND num=%d 
+0

मैं ओवरराइड पसंद है। धन्यवाद। –

+0

मुझे एक्स या वाई स्ट्रिंग्स होने पर shQuote सहायक लगता है। –

11

, के रूप में मैं कर रहा हूँ:

'%+%' <- function(x,y) paste(x,y,sep="") 

y<-"y1" 
x<-"somethingorother" 
query<- 
'SELECT DISTINCT x AS ' %+% x %+%',\n' %+% 
'    y AS ' %+% y %+% '\n' %+% 
' FROM tbl 
WHERE id=%s 
AND num=%d' 

cat(query,"\n") 

पैदावार , आप केवल sprintf() का उपयोग कर आनंद ले सकते हैं।

इयान के उदाहरण उधार:

y<-"y1" 
x<-"somethingorother" 
query <- sprintf(
'SELECT DISTINCT x AS %s, 
       y AS %s, 
FROM tbl 
WHERE id=%%s 
AND num=%%d', x, y) 

पैदावार:

> cat(query,"\n") 
SELECT DISTINCT x AS somethingorother, 
       y AS y1, 
FROM tbl 
WHERE id=%s 
AND num=%d 
+0

मैं मल्टी-लाइन तारों के भीतर इंटरपोलिंग के लिए स्प्रिंटफ का उपयोग करना पसंद करता हूं। पर्ल के डीबीआई में बयानों के लिए आप कैसे बाध्य करते हैं, यह हमेशा याद दिलाता है। और पठनीय। – medriscoll

1

मैं बस चलाने से पहले sql <- gsub("\n","",sql) और sql <- gsub("\t","",sql) साथ एसक्यूएल स्ट्रिंग मार समाप्त हो गया है। स्ट्रिंग स्वयं जितनी देर तक होनी चाहिए, लेकिन किसी भी कॉन्सटेनेशन मार्कअप से मुक्त रहती है।

3

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

sql <- "SELECT foo FROM bar 
    WHERE col1 = ? 
    AND col2 = ? 
    ORDER BY yomama" 

मुझे यकीन है कि अगर दोहरे-उद्धरण का सबसे अच्छा तरीका आर कोड में बहु लाइन तार एम्बेड करने के लिए है (यहां-डॉक्स की तरह कुछ है?) नहीं कर रहा हूँ, लेकिन यह, काम करता है जावा में विपरीत है।

क्या कोई कारण है कि आप अपने डेटाबेस में "\n" या "\t" भेजना नहीं चाहते हैं? वे एसक्यूएल में ठीक होना चाहिए।

+1

मैं इन प्लेसहोल्डर को मूल्य कैसे जोड़ सकता हूं? मुझे आरओडीबीसी के दस्तावेज में कुछ भी नहीं मिला। –

+0

कुछ ड्राइवर इसका समर्थन करते हैं, कुछ नहीं करते हैं। Http://stackoverflow.com/questions/2186015/bind-variables-in-r-dbi देखें। –

+0

आरओडीबीसी पैरामीटरयुक्त प्रश्नों का समर्थन नहीं करता है। RODBCext इसे जोड़ता है। ऐसा लगता है कि डीबीआई उन्हें जोड़ने की प्रक्रिया में है। – blongworth

5

का एक शानदार तरीका "" एक लंबी SQL क्वेरी को अलग .sql फ़ाइल में रखना है। पसंदीदा रूप से कहीं कहीं सिंटैक्स हाइलाइट किया जा सकता है, RStudio में एक टेक्स्ट फ़ाइल नौकरी करेगी। फिर आप अपनी मुख्य आर स्क्रिप्ट में फ़ाइल को एक स्ट्रिंग में पढ़ सकते हैं और कई "नामित" sprintf-प्रकार समाधानों जैसे कि infuser का उपयोग करके चर के साथ इसे पॉप्युलेट कर सकते हैं।

.sql

select * 
from mytable 
where id = {{a}} 
and somevar = {{b}} 

.R

library(readr) 
library(infuser) 

query <- read_file("query.sql") %>% 
     infuse(a = 1, b = 2) 
+0

एक तैयार कथन यह करने का सुरक्षित तरीका है। –

+0

कई मामलों में एक तैयार कथन भी अधिक कुशल है। यदि आपके डीबी में कैशिंग ऑप्टिमाइज़र है, तो यह विभिन्न बाध्य पैरामीटर के साथ एक ही कथन के लिए एक ही निष्पादन योजना का उपयोग कर सकता है, लेकिन यदि आप पैरामीटर को सीधे एसक्यूएल में प्रतिस्थापित करते हैं, तो शायद इसे हर बार योजना को दोबारा बदलना होगा। –

संबंधित मुद्दे