簡體   English   中英

如何在esqueleto查詢中進行比較之前應用函數

[英]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

如果它是內置函數(或用戶可定義的函數),則您可以執行類似的操作。

請參閱此處以添加postgresql函數trim的帖子:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM