Puis-je inclure gracieusement des chaînes SQL formatées dans un script R?

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

  •  06-07-2019
  •  | 
  •  

Question

Je travaille dans un script R qui utilise une longue chaîne SQL et j'aimerais que la requête soit relativement libre de tout autre balisage afin de permettre le copier-coller entre les éditeurs et les applications. J'aimerais également avoir la possibilité de scinder la requête sur plusieurs lignes pour une meilleure lisibilité.

Dans la documentation RODBC, la fonction paste est utilisée pour créer la requête à partir de morceaux séparés, mais je préférerais quelque chose de moins kludgy avec moins de guillemets et de guillemets. Merci pour votre aide.

Était-ce utile?

La solution

vous pouvez remplacer l'opérateur% +% pour obtenir une meilleure syntaxe de concaténation de chaînes:

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

donne:

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

Autres conseils

Si vous êtes un ancien programmeur C depuis longtemps, vous pouvez utiliser simplement sprintf ().

Emprunter l'exemple de Ian:

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

donne:

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

Une manière élégante de & "; inclure &"; une longue requête SQL consiste à le conserver dans un fichier .sql séparé. De préférence, là où la syntaxe est surlignée, un fichier texte dans RStudio fera le travail. Vous pouvez ensuite dans votre script principal R lire le fichier dans une chaîne et le renseigner avec des variables à l'aide de l'un des nombreux & Quot; nommés & Quot; sprintf - saisissez des solutions, telles que infuseur .

.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) 

Je vous conseillerais simplement d'utiliser une chaîne simple et de ne pas incorporer de valeurs de variable dans celle-ci. Utilisez des espaces réservés à la place.

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

Je ne sais pas si la guillemet double est le meilleur moyen d'intégrer des chaînes multilignes dans le code R (y a-t-il quelque chose comme ici-docs?), mais cela fonctionne, contrairement à Java.

Y a-t-il une raison pour laquelle vous ne souhaitez pas envoyer "\n" ou "\t" dans votre base de données? Cela devrait aller dans le code SQL.

J'ai fini par frapper simplement la chaîne SQL avec sql <- gsub("\n","",sql) et sql <- gsub("\t","",sql) avant de l'exécuter. La chaîne elle-même peut être aussi longue que nécessaire, mais reste libre de tout balisage de concaténation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top