أضف قيمة ديناميكية إلى rmysql getquery [مكررة

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

  •  28-09-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

هل من الممكن تمرير قيمة في الاستعلام في dbGetQuery من حزمة RMYSQL.

على سبيل المثال ، إذا كان لدي مجموعة من القيم في متجه الأحرف:

df <- c('a','b','c')

وأريد أن أحلق من خلال القيم لسحب قيمة محددة من قاعدة بيانات لكل منها.

library(RMySQL)    
res <- dbGetQuery(con, "SELECT max(ID) FROM table WHERE columna='df[2]'")

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

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

المحلول

أحد الخيارات هو معالجة سلسلة SQL داخل الحلقة. في الوقت الحالي لديك سلسلة حرفية ، 'df[2]' لا يتم تفسيره بواسطة R على أنه أي شيء آخر غير الشخصيات. سيكون هناك بعض الغموض في إجابتي ، لأن df في Q الخاص بك ليس إطار بيانات (هو متجه الأحرف!). شيء من هذا القبيل سوف يفعل ما تريد.

تخزين الإخراج في ناقل رقمي:

require(RMySQL)
df <- c('a','b','c')
out <- numeric(length(df))
names(out) <- df

الآن يمكننا أن نحلق على عناصر df لتنفيذ استفسارك ثلاث مرات. يمكننا ضبط الحلقة بطريقتين: أنا) مع i كرقم نستخدمه للإشارة إلى عناصر df و out, أو الثاني) مع i مثل كل عنصر من عناصر df بدوره (أي a, ، ومن بعد b, ، ...). سأعرض كلا الإصدارين أدناه.

## Version i
for(i in seq_along(df)) {
    SQL <- paste("SELECT max(ID) FROM table WHERE columna='", df[i], "';", sep = "")
    out[i] <- dbGetQuery(con, SQL)
    dbDisconnect(con)
}

أو:

## Version ii
for(i in df) {
    SQL <- paste("SELECT max(ID) FROM table WHERE columna='", i, "';", sep = "")
    out[i] <- dbGetQuery(con, SQL)
    dbDisconnect(con)
}

التي تستخدمها تعتمد على الذوق الشخصي. يتطلب منك الإصدار الثاني (2) تعيين أسماء على متجه الإخراج out التي هي نفس البيانات الموجودة في الداخل out.

بعد قول كل ذلك ، على افتراض أن استعلام SQL الفعلي الخاص بك يشبه تلك التي تنشرها ، ألا يمكنك القيام بذلك في عبارة SQL واحدة ، باستخدام ملف GROUP BY بند ، لتجميع البيانات قبل الحوسبة max(ID)؟ من المحتمل أن يكون القيام بأشياء بسيطة في قاعدة البيانات مثل هذه أسرع بكثير. لسوء الحظ ، ليس لدي مثال MySQL للعب مع SQL-FU الخاص بي ضعيف حاليًا ، لذلك لا يمكنني إعطاء مثال على ذلك.

نصائح أخرى

يمكنك أيضا استخدام sprintf أمر لحل المشكلة (هذا ما أستخدمه عند بناء تطبيقات لامعة).

df <- c('a','b','c')

res <- dbGetQuery(con, sprintf("SELECT max(ID) FROM table WHERE columna='%s'"),df())

يجب أن يعمل شيء على هذا المنوال.

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