使用 Firebird 的“SUBSTR”函数进行查询 [关闭]

Posted

技术标签:

【中文标题】使用 Firebird 的“SUBSTR”函数进行查询 [关闭]【英文标题】:query using function “SUBSTR” of Firebird [closed] 【发布时间】:2016-09-12 13:57:18 【问题描述】:

我需要使用带有linq-to-nhibernate、queryover 或nhibernate-criteria 的firebird SUBSTR 函数编写NHibernate 查询。我可能会使用hql 或SQL,但这是我最后的选择。

有人有什么想法吗?以下示例查询将是我的 NHibernate 查询产生的 SQL:

SELECT *
FROM LANCAMENTO
WHERE SUBSTR(LAN_CD_CONTA, 1, 13) = :paramCd_Conta

【问题讨论】:

好吧,从 NHibernate 精通用户的角度来看,这个问题并不清楚,也许是我。奇怪的是,看起来更接近的选民在nhibernate 中没有一个点。 (但也许我检查他们的个人资料有点太快了。) 无论如何,马科斯,如果您希望它保留而不被删除,您应该编辑您的问题,也许是为了使其更明确,即使对于非 NH 用户也是如此。我至少要编辑语法,但作为一个“外国”编辑,我必须避免走得太“远”,我们必须保留原始的 OP(你)意图。 有点晚了,但我想知道,直接在 Linq lambda 中调用 .SubString() 可能会导致调用 substr Firebird 函数。 linq-to-nhibernate 确实支持字符串上的 .SubString()。你试过吗? 是的,但我认为它 (.substring) 在您运行查询之后执行,而不是在您将查询发送到数据库时执行。 不,如果在实体属性上调用,它只能在 db 端运行,因为可查询对象不知道属性值。 【参考方案1】:

使用 Linq,声明一个 SubStr 扩展方法:

using NHibernate.Linq;

...

public static class CustomLinqExtensions

    [LinqExtensionMethod("SUBSTR")]
    public static string SubStr(this string dummy, int start, int length)
    
        // No need to implement it in .Net, unless you wish to call it
        // outside IQueryable context too.
        throw new NotImplementedException("This call should be translated " +
            "to SQL and run db side, but it has been run with .Net runtime");
    

然后在您的实体上使用它:

session.Query<Lancamento>()
    .Where(l => l.CdConta.SubStr(1, 13) == cdConta)
    .ToList();

请注意,尝试在不引用实体的情况下使用它会导致使用 .Net 运行时对其进行评估,而不是将其转换为 SQL。

【讨论】:

我用 SAME sql pure 做了,谢谢你的帮助。

以上是关于使用 Firebird 的“SUBSTR”函数进行查询 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Firebird 数据库使用经验总结

Oracleregexp_substr()函数详解

使用 Symmetricds 时出现 Firebird 错误

firebird 1.5 中的事务

oracle的常用函数 instr() 和substr()函数

Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结