PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एकाधिक चयन इनपुट मान अप्रत्याशित dplyr (पोस्टग्रेज) व्यवहार बनाते हैं

समस्या यह है कि जब आप केवल एक . का चयन करते हैं तो क्वेरी कैसे बनाई जाती है तत्व और IN . का उपयोग करें ऑपरेटर। dplyr SQL में अनुवाद उचित कोष्ठक नहीं जोड़ता है और इस प्रकार, विफल हो जाता है। इस मुद्दे पर यहां लंबी चर्चा हुई। .

इसे हल करने का एक तरीका filter() . को एक अलग निर्देश पास करना है जब length इनपुट का 1 के बराबर है (नीचे उदाहरण देखें)।

यहाँ क्या हो रहा है:

tbl(mydb, "iris") %>%
  filter(Species %in% c("setosa", "versicolor")) %>%
  .$query

उचित SQL देता है क्वेरी सिंटैक्स:

<Query> SELECT "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species"
FROM "iris"
WHERE "Species" IN ('setosa', 'versicolor')
<PostgreSQLConnection>

और, यदि क्रियान्वित किया जाता है, तो अपेक्षित देता है:

#Source: postgres 9.3.13 [[email protected]:5432/csvdump]
#From: iris [100 x 5]
#Filter: Species %in% c("setosa", "versicolor") 
#
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#          (dbl)       (dbl)        (dbl)       (dbl)   (chr)
#1           5.1         3.5          1.4         0.2  setosa
#2           4.9         3.0          1.4         0.2  setosa
#3           4.7         3.2          1.3         0.2  setosa
#4           4.6         3.1          1.5         0.2  setosa
#5           5.0         3.6          1.4         0.2  setosa
#6           5.4         3.9          1.7         0.4  setosa
#7           4.6         3.4          1.4         0.3  setosa
#8           5.0         3.4          1.5         0.2  setosa
#9           4.4         2.9          1.4         0.2  setosa
#10          4.9         3.1          1.5         0.1  setosa
#..          ...         ...          ...         ...     ...

देखते हैं कि क्या होता है यदि आप किसी एक तत्व को पास करने का प्रयास करते हैं:

tbl(mydb, "iris") %>%
  filter(Species %in% "setosa") %>%
  .$query

क्वेरी होगी:

<Query> SELECT "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species"
FROM "iris"
WHERE "Species" IN 'setosa'
<PostgreSQLConnection>

जिसे यदि निष्पादित किया जाता है, तो निम्न त्रुटि का परिणाम होगा:

ऐसा इसलिए है क्योंकि एक ही तत्व के लिए, dplyr SQL में अनुवाद query उचित कोष्ठक नहीं जोड़ता है। ध्यान दें कि यह कैसा है 'setosa' ('setosa') . के बजाय .

इससे बचने के लिए, हम यह कर सकते हैं:

if(length(input$Species) == 1) { 
  tbl(mydb, "iris") %>% 
    filter(Species == input$Species) %>% 
}

जो वाक्यात्मक रूप से मान्य SQL का निर्माण करेगा क्वेरी:

<Query> SELECT "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species" 
FROM "iris" 
WHERE "Species" = 'setosa' 
<PostgreSQLConnection>

निम्न उदाहरण इस समस्या को हल करता है। यहां मैं बस ऐप को filter(Species == ...) . पास करने का निर्देश देता हूं अगर input$Species length का है 1 और filter(Species %in% ...) अन्यथा।

चमकदार ऐप

server <- function(input, output) {

  selectedQuery <- reactive({

    if(length(input$Species) == 1) { 
      tbl(mydb, "iris") %>% 
        filter(Species == input$Species) %>% 
        .$query
    }
    else(
      tbl(mydb, "iris") %>% 
        filter(Species %in% input$Species) %>% 
        .$query
      )

  })

  selectedData <- reactive({

    if(length(input$Species) == 1) {
      tbl(mydb, "iris") %>% 
        filter(Species == input$Species) %>% 
        data.frame
    }
    else(
      tbl(mydb, "iris") %>% 
        filter(Species %in% input$Species) %>% 
        data.frame
      )
  })

  output$plot <- renderPlot({
    ggplot2::qplot(Sepal.Length, Petal.Length, data = selectedData(), color = Species)
  })

  output$query <- renderPrint({
    selectedQuery()
    })
}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("Species", "Species", 
                  tbl(mydb, "iris") %>% 
                    data.frame %>% 
                    .$Species %>% 
                    unique, 
                  selected = "setosa", multiple = TRUE)
    ),
    mainPanel(
      textOutput("query"),
      plotOutput("plot")
      )
  )
)

shinyApp(ui = ui, server = server)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psycopg2 स्थापित करना मैकोज़ पर अस्पष्ट त्रुटि संदेश के साथ विफल रहता है

  2. Postgres में, आप किसी विशेष कॉलम के लिए संभावित मानों को कैसे प्रतिबंधित करते हैं?

  3. Postgres अनुक्रमणिका नाम किस स्तर पर अद्वितीय होने चाहिए?

  4. Postgresql 9.1 से 9.3 में अपग्रेड करते समय लॉग फ़ाइल pg_upgrad_internal.log पर नहीं लिख सकता

  5. Postgresql रिमोट एक्सेस होस्ट के लिए कोई pg_hba.conf प्रविष्टि नहीं है