[英]How to apply a function before comparison in an esqueleto query
對於這樣簡單的查詢
runDb . select . from $ \cell -> do
where_ $ cell ^. CellCode ==. val "x"
return cell
我想在將字段值與“ x”進行比較之前應用一個函數。 其原因是,小區代碼后在數據庫中,沒有什么比用修剪他們離開,如容易空格條從Data.Text
。 但是,我最初使用fmap
(兩次)導致
No Instance for (Functor SqlExpr)
我知道Esqueleto提供的功能(例如just
)可以專門完成類似的功能(盡管我找不到just
的實現)。
有沒有辦法在打包值上應用任何功能?
在寫作時:在我的特定情況下,我可能只想使用like
。
編輯:添加了我要應用的特定功能。
您要應用哪種功能?
這是某人在查詢中添加了調用chr()
函數的功能的方式:
https://github.com/krisajenkins/esqueleto/commit/fa1d1c888770e297fef52d76b6cb68342a6c0376
如果它是內置函數(或用戶可定義的函數),則您可以執行類似的操作。
import Database.Esqueleto.Internal.Sql
trim :: (IsString s) => SqlExpr (Value s) -> SqlExpr (Value s) -> SqlExpr (Value s)
trim pattern target =
unsafeSqlFunction "trim" (unsafeSqlBinOp "FROM" pattern target)
(如果您不使用postgres,則可能需要查閱數據庫中的文檔以查找其是否支持類似的東西。)
unsafeSqlFunction
可以用於導入數據庫支持的任何功能,但這是不安全的,因為您有責任確保類型簽名實際上是數據庫期望的。 該名稱將原樣復制到您的SQL。
unsafeSqlBinOp
類似,但是它定義了一個二進制操作: unsafeSqlBinOp "FROM" "a" "b"
被轉換為SQL "a" FROM "b"
。
這樣,您應該可以執行以下操作:
runDb . select . from $ \cell -> do
where_ $ trim " " (cell ^. CellCode) ==. val "x"
return cell
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.