هل يمكنني تضمين سلاسل SQL المنسقة في برنامج نصي R؟

StackOverflow https://stackoverflow.com/questions/1630724

  •  06-07-2019
  •  | 
  •  

سؤال

أنا أعمل في برنامج نصي R يستخدم سلسلة SQL طويلة، وأود أن أبقي الاستعلام خاليًا نسبيًا من العلامات الأخرى حتى أسمح بالنسخ واللصق بين المحررين والتطبيقات.أود أيضًا أن أتمكن من تقسيم الاستعلام عبر الأسطر لتحسين إمكانية القراءة.

في وثائق RODBC، فإن paste يتم استخدام الوظيفة لإنشاء الاستعلام من أجزاء منفصلة، ​​لكنني أفضل شيئًا أقل تعقيدًا ومع عدد أقل من علامات الاقتباس والفواصل.شكرا لمساعدتك.

هل كانت مفيدة؟

المحلول

يمكنك تجاوز عامل التشغيل %+% للحصول على بنية سلسلة سلسلة أفضل:

'%+%' <- 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")

عائدات:

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

نصائح أخرى

إذا كنت مبرمجًا قديمًا للغة C منذ زمن بعيد، مثلي، فقد تستمتع باستخدام 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 

طريقة رشيقة "مشتمل" استعلام SQL طويل هو الاحتفاظ به في ملف منفصل .sql ملف.ويفضل أن يكون في مكان ما يمكن إبراز بناء الجملة فيه، وسيقوم ملف نصي في RStudio بالمهمة.يمكنك بعد ذلك في برنامج R النصي الرئيسي الخاص بك قراءة الملف في سلسلة وتعبئته بالمتغيرات باستخدام أحد "المسمى" الكثير. sprintf- نوع الحلول مثل المساعد على التحلل.

.sql

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

ر

library(readr)
library(infuser)

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

أوصي فقط باستخدام سلسلة عادية، وعدم تضمين قيم متغيرة فيها.استخدم العناصر النائبة بدلاً من ذلك.

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

لست متأكدًا مما إذا كان الاقتباس المزدوج هو أفضل طريقة لتضمين سلاسل متعددة الأسطر في كود R (هل يوجد شيء مثل المستندات هنا؟)، ولكنه يعمل، على عكس Java.

هل هناك سبب لعدم رغبتك في الإرسال "\n" أو "\t" إلى قاعدة البيانات الخاصة بك؟يجب أن يكونوا جيدين في SQL.

لقد انتهى بي الأمر ببساطة بضرب سلسلة SQL بـ sql <- gsub("\n","",sql) و sql <- gsub("\t","",sql) قبل تشغيله.يمكن أن تكون السلسلة نفسها طويلة كما يجب، ولكنها تظل خالية من أي علامات تسلسلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top