में संबंधित स्थिर क्वेरी के समान चीज़ को वापस नहीं लौटा रही है। मैं हास्केल में SQL क्वेरी जेनरेट कर रहा हूं और उन्हें एचडीबीसी का उपयोग कर SQLite (3) डेटाबेस में सबमिट कर रहा हूं।जेनरेटेड एसक्यूएल क्वेरी एसक्लाइट 3 एचडीबीसी
import Database.HDBC.Sqlite3
import Database.HDBC
data UmeQuery = UmeQuery String [SqlValue] deriving Show
tRunUmeQuery :: UmeQuery -> FilePath -> IO [[SqlValue]]
tRunUmeQuery (UmeQuery q args) dbFile = do
conn <- connectSqlite3 dbFile
stat <- prepare conn q
s <- execute stat args
res <- fetchAllRows' stat
disconnect conn
return $ res
selectPos targetlt parentlt op pos = let
q= "select TARGET.* from levels tl, labeltypes tlt, segments TARGET,
(select TARGET.session_id session_id,SECONDARY.labeltype_id labeltype_id,
SECONDARY.label_id label_id,min(TARGET.label_id) min_childlabel_id from
levels tl, labeltypes tlt, segments TARGET, segments SECONDARY, labeltypes slt,
levels sl where TARGET.session_id = SECONDARY.session_id and ((SECONDARY.start
<= TARGET.start and TARGET.end <= SECONDARY.end) or (TARGET.start <= SECONDARY.start
and SECONDARY.end <= TARGET.end)) and tl.name = ? and sl.name = ? and SECONDARY.label '
!= '' and tl.id = tlt.level_id and sl.id = slt.level_id and tlt.id = TARGET.labeltype_id
and slt.id = SECONDARY.labeltype_id group by TARGET.session_id, TARGET.labeltype_id,
SECONDARY.label_id) SUMMARY, segments SECONDARY, labeltypes slt, levels sl where
TARGET.session_id = SECONDARY.session_id and TARGET.session_id = SUMMARY.session_id
and ((SECONDARY.start <= TARGET.start and TARGET.end <= SECONDARY.end) or (TARGET.start
<= SECONDARY.start and SECONDARY.end <= TARGET.end)) and tl.name = ? and sl.name = ?
and tl.id = tlt.level_id and tlt.id = TARGET.labeltype_id and SUMMARY.labeltype_id =
SECONDARY.labeltype_id and SUMMARY.label_id = SECONDARY.label_id and sl.id = slt.level_id
and slt.id = SECONDARY.labeltype_id and (TARGET.label_id - SUMMARY.min_childlabel_id +1) = 2 "
a = [toSql targetlt, toSql parentlt, toSql targetlt, toSql parentlt ]
in UmeQuery q a
, जो जब डेटाबेस के लिए लागू सही काम देता है:
> let a =selectPos "Word" "Utterance" "=" 2
> let b = tRunUmeQuery a testdb
> b
आउटपुट:
[[SqlByteString "1", SqlByteString अब, यह समारोह एक प्रश्न रिटर्न "2", एसक्लबाइटस्ट्रिंग "3", एसक्लबेटस्ट्रिंग "0.149383838383838", एसक्लबेटस्ट्रिंग "0.312777777777778", एसक्लबेटस्ट्रिंग "दूसरा"], [एसक्लबेटस्ट्रिंग "1", एसक्लबेटस्ट्रिंग "2", एसक्लबीस्टस्ट्रिंग "6", SqlByteString ".507488888888889",, SqlByteString ".655905050505051", SqlByteString "चौथा"] [SqlByteString "2", SqlByteString "2", "3" SqlByteString, ".149383838383838" SqlByteString, SqlByteString ".312777777777778", "दूसरी"] SqlByteString, [ "2" SqlByteString, "2" SqlByteString, "6", SqlByteString ".507488888888889" SqlByteString, SqlByteString ".655905050505051", SqlByteString "चौथा"], [SqlByteString "3", SqlByteString " 2 ", SqlByteString" 3 ", SqlByteString " .149383838383838 ", SqlByteString" .312777777777778 ", SqlByteString" दूसरी "], [SqlByteString" 3 ", SqlByteString" 2 ", SqlByteString " 6 ", SqlByteString" .507488888888889 ",SqlByteString 210 ".655905050505051", SqlByteString "चौथा"]]
अब, जब मैं (क्षमा करें, आप के लिए स्ट्रिंग के अंत तक स्क्रॉल करने के लिए है इस तरह क्वेरी में छोटे गतिशील भागों के एक जोड़े को सम्मिलित करने की जरूरत है, इस देखें):
selectPos targetlt parentlt op pos = let
q= "select TARGET.* from levels tl, labeltypes tlt, segments TARGET,
(select TARGET.session_id session_id,SECONDARY.labeltype_id labeltype_id,
SECONDARY.label_id label_id,min(TARGET.label_id) min_childlabel_id from
levels tl, labeltypes tlt, segments TARGET, segments SECONDARY, labeltypes slt,
levels sl where TARGET.session_id = SECONDARY.session_id and ((SECONDARY.start
<= TARGET.start and TARGET.end <= SECONDARY.end) or (TARGET.start <= SECONDARY.start
and SECONDARY.end <= TARGET.end)) and tl.name = ? and sl.name = ? and SECONDARY.label
!= '' and tl.id = tlt.level_id and sl.id = slt.level_id and tlt.id = TARGET.labeltype_id
and slt.id = SECONDARY.labeltype_id group by TARGET.session_id, TARGET.labeltype_id,
SECONDARY.label_id) SUMMARY, segments SECONDARY, labeltypes slt, levels sl where
TARGET.session_id = SECONDARY.session_id and TARGET.session_id = SUMMARY.session_id
and ((SECONDARY.start <= TARGET.start and TARGET.end <= SECONDARY.end) or (TARGET.start
<= SECONDARY.start and SECONDARY.end <= TARGET.end)) and tl.name = ? and sl.name = ?
and tl.id = tlt.level_id and tlt.id = TARGET.labeltype_id and SUMMARY.labeltype_id =
SECONDARY.labeltype_id and SUMMARY.label_id = SECONDARY.label_id and sl.id = slt.level_id
and slt.id = SECONDARY.labeltype_id and (TARGET.label_id - SUMMARY.min_childlabel_id +1) "
++ op ++ " ? "
a = [toSql targetlt, toSql parentlt, toSql targetlt, toSql parentlt , toSql pos]
in UmeQuery q a
और एक ही बात करते हैं, मैं:
> let a =selectPos "Word" "Utterance" "=" 2
> let b = tRunUmeQuery a testdb
> b
[]
दूसरी क्वेरी कैसे वापस आती है (या, वही चीज़ वास्तव में)?
कोई विचार?
संपादित करें:
Ive यह आगे की जांच की, यह सोचकर कि इससे किसी भी तरह आलसी से कोई लेना देना हो सकता है। ठीक है, का अब यह करने के लिए नया रूप दिया गया है
selectPos :: String -> String -> String -> Integer -> [[SqlValue]]
selectPos targetlt parentlt op pos = let
q= foldl' (++) [] ["select TARGET.* from levels tl, labeltypes tlt, segments TARGET,
(select TARGET.session_id session_id,SECONDARY.labeltype_id labeltype_id,SECONDARY.label_id
label_id,min(TARGET.label_id) min_childlabel_id from levels tl, labeltypes tlt, segments
TARGET, segments SECONDARY, labeltypes slt, levels sl where TARGET.session_id = SECONDARY.session_id "
,matchstring , " and tl.name = ? and sl.name = ? and SECONDARY.label != '' and tl.id = tlt.level_id
and sl.id = slt.level_id and tlt.id = TARGET.labeltype_id and slt.id = SECONDARY.labeltype_id
group by TARGET.session_id, TARGET.labeltype_id, SECONDARY.label_id) SUMMARY, segments SECONDARY,
labeltypes slt, levels sl where TARGET.session_id = SECONDARY.session_id and TARGET.session_id =
SUMMARY.session_id " , matchstring , " and tl.name = ? and sl.name = ? and tl.id = tlt.level_id
and tlt.id = TARGET.labeltype_id and SUMMARY.labeltype_id = SECONDARY.labeltype_id and SUMMARY.label_id
= SECONDARY.label_id and sl.id = slt.level_id and slt.id = SECONDARY.labeltype_id and
(TARGET.label_id - SUMMARY.min_childlabel_id +1) " , op , " ? "]
a = [toSql targetlt, toSql parentlt, toSql targetlt, toSql parentlt , toSql (pos :: Integer)]
in UmeQuery q a
दुर्भाग्य से, इस मुद्दे को मदद नहीं करता है (और जब मैं: GHCi में समारोह की वापसी मान स्प्रिंट, यह अभी भी में unevaluated)। तो, आलस्य किसी भी तरह का मुद्दा हो सकता है, लेकिन मुझे नहीं पता कि यह पूरी तरह से मूल्यांकन कैसे किया जाए ..? कृपया, कोई विचार?
आप न्यूलाइन का उपयोग करना चाहेंगे ताकि SQL कमांड पठनीय हो सके। जेनरेट एसक्यूएल भी दिखाएं। –
हो गया! कृपया मुझे समझने में सहायता करें कि इन दो प्रश्नों को उसी तरह क्यों निष्पादित नहीं किया गया है। –
मेरे उत्तर पर नज़र डालें और मुझे बताएं कि क्या मैं कुछ सेट अप करता हूं जो कि आप जो चल रहे हैं उससे काफी अलग है। मैं ईमानदारी से किसी और चीज के बारे में सोच नहीं सकता। मैं उन तारों को संयोजित करके एक खाली सेट को पुन: पेश नहीं कर सकता (जो अनिवार्य रूप से आप बदलते हैं)। –