Как я могу использовать переменную при получении доступа ODB C с R? - PullRequest
1 голос
/ 17 апреля 2020

Я только что закончил получать данные через ODBC, используя предложения запроса.

library(rJava)
library(RJDBC)

jdbcDriver <- JDBC(driverClass="oracle.jdbc.OracleDriver", 
classPath="C:/oracle/product/11.2.0/client_1/jdbc/lib/ojdbc6.jar")
con <- dbConnect(jdbcDriver, "jdbc:oracle:thin:@111.111.1.111:1111:FS05","11111","11111")
query <- "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%D3771%' AND TYPE_GB ='A2' 
AND END_YMD = '99999999'"

result <- dbGetQuery(con,query)
head(result)

Используя эти предложения Можно взять все данные, которые я хочу. Но я хочу обобщить этот код

Я имею в виду, даже когда я не знаю выражения типа «D3771», я хочу сделать это общее что-то. Например, выражение произвольно определяется как A2942, B5828, C1294 ... sth .. затем я хочу получить информацию, используя этот случайный результат, поэтому я сохраняю это случайное выражение в переменной 'box'

, поэтому я хочу сделать запрос подобным этому "SELECT FUND_CD, FUND_FNM ИЗ A001, ГДЕ FUND_CD, КАК * '% box%' AND TYPE_GB = 'A2' AND END_YMD = '99999999' '

Опять же, в конце мне не нужно вставлять A2942, B5828, C1294 непосредственно в запрос. просто случайное выражение, сохраненное в переменной 'box', затем с использованием для l oop выражения в поле автоматически изменяется и применяется к запросу, чтобы получить соответствующий результат.

Спасибо.

1 Ответ

0 голосов
/ 17 апреля 2020

Захватите части c частей вашего запроса в объекте

query <- "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%random_box%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"

Произвольно сгенерируйте комбинацию букв и цифр

letters    <- c("A", "B", "C")
random_box <- paste0(sample(letters, 1),round(runif(0,9999, n = 1)))

Подставьте это в ваш запрос

new.query <- gsub("random_box", random_box, query)

Теперь new.query имеет значение типа

[1] "SELECT FUND_CD, FUND_FNM ОТ A001, ГДЕ FUND_CD НРАВИТСЯ '% B5647%' И TYPE_GB = 'A2' И END_YMD = ' 99999999 '"

Вы можете установить значения min и max числа в runif. Если необходимо иметь определенное количество цифр, вы также можете «дополнить» числа 0, так что если ваше случайное число маленькое, например 12, вы получите 0012 вместо 12.

Чтобы увеличить это, вы можете либо запустить простой взгляд, либо l oop, либо просто увеличить n из sample и / или runif до любого желаемого размера, либо создать множество копий оператора из этих результатов. или измените оператор SQL, включив ключевое слово "ИЛИ" между каждым результатом, так что вам нужно будет выполнить только 1 SQL оператор.

Например, вместо получения 1 нового результат, если вы хотели 10, то вы могли бы просто сделать что-то вроде этого:

random_box <- paste0(sample(letters, 2),round(runif(0,9999, n = 10)))
length(random_box) # [1] 10

all        <- sapply(random_box, function(random_box) gsub("random_box", random_box, query))
names(all) <- NULL

all
 [1] "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%C1866%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"
 [2] "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%A3236%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"
 [3] "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%C8977%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"
 [4] "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%A735%' AND TYPE_GB ='A2' AND END_YMD = '99999999'" 
 [5] "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%C2102%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"
 [6] "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%A3169%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"
 [7] "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%C2358%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"
 [8] "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%A6846%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"
 [9] "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%C5268%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"
[10] "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%A4433%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"

Тогда вы могли бы выполнить l oop и выполнить эти операторы 1 одновременно. Кроме того, вы можете поместить все результаты в оператор 1 SQL, используя ключевое слово «ИЛИ» между каждым результатом, в зависимости от того, что вам нужно.

Обновление

Вы упомянули, что вместо замены ключевого слова в строке вы хотели использовать переменную:

query.part1 <- "SELECT FUND_CD, FUND_FNM FROM A001 WHERE FUND_CD LIKE '%" 
query.part2 <- "%' AND TYPE_GB ='A2' AND END_YMD = '99999999'"

paste0(query.part1, random_box, query.part2)

и здесь все в одном выражении:

value <- capture.output(cat(paste0(random_box, "%' OR '%")))

all.in.one <- paste0(query.part1, 
                     value, 
                     query.part2)

gsub("OR '%%'", "", all.in.one)

[1 ] "ВЫБРАТЬ FUND_CD, FUND_FNM ИЗ A001 ГДЕ FUND_CD НРАВИТСЯ '% C1866%' ИЛИ ​​'% A3236%' ИЛИ ​​'% C8977%' ИЛИ ​​'% A735%' ИЛИ ​​'% C2102%' ИЛИ ​​'% A3169%' ИЛИ ​​'% C2358 % 'ИЛИ'% A6846% 'ИЛИ'% C5268% 'ИЛИ'% A4433% 'И TYPE_GB =' A2 'И END_YMD =' 99999999 '"

В зависимости от типа c из SQL (T- SQL, MySQL, et c) вам может потребоваться выполнить некоторые тривиальные корректировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...