使用 LIKE 将 Oracle 查询转换为 SQL Server 查询

Posted

技术标签:

【中文标题】使用 LIKE 将 Oracle 查询转换为 SQL Server 查询【英文标题】:Converting an Oracle Query using LIKE to SQL Server Query 【发布时间】:2021-05-08 01:19:27 【问题描述】:

我正在转换使用 Oracle 数据库的应用程序。在部分代码中 有一个条件(下)。在 ELSE 中,他们使用带有“0%”的 LIKE。 数据库中id的长度总是8,所以我不明白为什么它检查长度为10。所以发生的情况是如果用户输入一个有效的id(12345678),它总是会去ELSE .但我不明白 LIKE 实际上在做什么。 TSQL 的转换是什么?

        if (id.Length == 10)
        
            sb.Append("where job_id = :ID ");
        
        else
        
            sb.AppendFormat("where job_id like '0%' order by job_id desc ", id);
        

【问题讨论】:

【参考方案1】:

like 确定特定字符串是否与指定模式匹配。模式可以包括常规字符和通配符。 所以你的查询基本上看 id 长度,如果它是 10,那么它会尝试找到完全匹配的 否则它会查找以 0 开头的任何 job_id(看起来很奇怪的逻辑)

【讨论】:

"否则它会查找以 0 开头的任何 job_id" -- 不,0 是一个占位符,并替换为 id 的值。所以通常它不会搜索“任何以 0 开头的 job_id”,除非 id 当然是 0【参考方案2】:

sbStringBuilder 我相信? (您应该始终在问题中包含此类信息!)然后AppendFormat() 的参数(对于给定的重载)是一个格式字符串,然后是任意数量的参数。要寻址格式字符串中的参数,可以使用 中包含的索引。 0 是第一个参数的占位符,1 是第二个参数,依此类推。所以说如果id123 例如"where job_id like '123%' order by job_id desc 将被追加。

LIKE 是一个比较两个字符串的运算符。第二个操作数可以使用通配符 -- 在 Oracle SQL Server 中,% 用于任何或零个任意字符(包括根本没有字符)或_ 用于恰好一个任意字符。例如 'ABCDEF' LIKE 'ABC%''ABCDED LIKE '%CD%'` 将是真的。 SQL Server 也允许其他一些模式,但这里不关心这些。所以这里没有什么要翻译的,表达式在Oracle SQL Server中都是有效的。

现在 C# 代码所做的是将 where job_id = :ID 附加到字符串中,如果 id(我假设是 string)的长度为 10 个字符。否则,它会附加where job_id like '0%' order by job_id desc,其中0 将替换为id 的值。

但是代码有缺陷。您永远不应使用字符串连接或插值来为 SQL 查询插入值,而应始终使用参数。所以

sb.AppendFormat("where job_id like '0%' order by job_id desc ", id);

应该是这样的

sb.Append("where job_id like concat(:ID, '%') order by job_id desc ");

concat() 连接给它的字符串。当然,这可能需要更改执行查询的后续调用以提供参数值。)

我无法判断仅当id 的长度不是 10 时才对结果进行排序是否有意义,也无法判断仅在长度为 10 时精确搜索它是否有意义,但对于任何以开头的值否则,因为我不知道它背后的原因。但这肯定看起来很奇怪。也许整个if ... else ... 应该简单地替换为

sb.Append("where job_id like concat(:ID, '%') order by job_id desc ");

毕竟。

【讨论】:

SQL Server 参数以@ 而非: 开头

以上是关于使用 LIKE 将 Oracle 查询转换为 SQL Server 查询的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL连接Oracle使用like模糊查询中文时返回结果为空

ORACLE模糊查询语句 当条件为 like %(% 或者like %)%时 结果为全查吗

mysql模糊查询区分大小写

ORACLE 快速查询数据SQL语句

求助oracle like%.%模糊查询优化

MySQL(Oracle)模糊查询 使用 instr () 替代 like 提升效率