首頁 > 資料庫 > mysql教程 > JSqlParser-MySQL Convert(expr,type) 函數的問題

JSqlParser-MySQL Convert(expr,type) 函數的問題

DDD
發布: 2024-12-13 08:03:10
原創
270 人瀏覽過

JSqlParser- problem with MySQL Convert(expr,type) function

我們最近將基礎框架升級到了 springboot 3.3.5 和其他相關函式庫。

測試期間向我報告了一個錯誤。使用 JSqlParser 5.0 時某些查詢會失敗。

這是一個簡單的示範:

public class Test {
  public static void main(String[] args) throws JSQLParserException {
    String sql =
        "SELECT  CONVERT(IF(bill_type = 2, id, ''), char) from dual";
    Statement statement2 = CCJSqlParserUtil.parse(sql);
    System.out.println(statement2.toString());
  }
}
登入後複製

問題在於 JSqlParser 5.0 不支援 MySQL 風格的 CONVERT 語法 CONVERT(expr, type)。它僅支援:

SQL Server 樣式:CONVERT(type, expr)
字符集轉換:CONVERT(expr USING charset)
這會影響使用 MySQL 的 CONVERT 函數的查詢,尤其是當表達式很複雜時(例如使用 IF 語句)。

JSqlParser 中的當前語法:

{
    <K_CONVERT> "("
    (
        LOOKAHEAD(ColDataType() ",") (
            colDataType = ColDataType()
            "," expression = Expression()
            [ "," style = <S_LONG> ]
        )
        |
        (
            expression = Expression()
            <K_USING> transcodingName=IdentifierChain()
        )
    )
    ")"
}
登入後複製

這個問題有兩種解決方案:

  1. 使用 CAST 而不是 CONVERT
    只要將 CONVERT(expr, type) 替換為 CAST(expr AS type) 即可。如果您使用 MySQL

  2. ,這是最簡單的解決方案
  3. 修改 JSqlParser 語法支援 CONVERT(expr, type)
    需要修改語法規則以支援MySQL語法。但是,請小心 TranscodingFunction.appendTo 方法。目前實作會產生 CONVERT(type, expr),這在 SQL Server 中是合法的,但在 MySQL 中是非法的

    public StringBuilder appendTo(StringBuilder builder) {
        if (isTranscodeStyle) {
            return builder
                    .append("CONVERT( ")
                    .append(expression)
                    .append(" USING ")
                    .append(transcodingName)
                    .append(" )");
        } else {
            return builder
                    .append("CONVERT( ")
                    .append(colDataType)
                    .append(", ")
                    .append(expression)
                    .append(transcodingName != null && !transcodingName.isEmpty()
                            ? ", " + transcodingName
                            : "")
                    .append(" )");
        }
    }
登入後複製

以上是JSqlParser-MySQL Convert(expr,type) 函數的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板