使用 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】:
sb
是StringBuilder
我相信? (您应该始终在问题中包含此类信息!)然后AppendFormat()
的参数(对于给定的重载)是一个格式字符串,然后是任意数量的参数。要寻址格式字符串中的参数,可以使用 中包含的索引。
0
是第一个参数的占位符,1
是第二个参数,依此类推。所以说如果id
是123
例如"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模糊查询中文时返回结果为空