sql-server - IN() 中子查询的 csv 导致转换错误
问题描述
CROSS APPLY (
SELECT
ISNULL(
(
SELECT
SUM (R.CALORIE)
FROM
TA_RECIPE AS R
WHERE
R.NO_RECIPE IN ([mp].recipe_ids)
OR R.NO_RECIPE IN ([tags2].recipe_ids)
),
0
) AS caloriePerPortion
) AS [CAL]
问题出在部分
R.NO_RECIPE IN ([mp].recipe_ids)
OR R.NO_RECIPE IN ([tags2].recipe_ids)
当 recipe_ids 中只有一个 id 时,recipe_ids 包含逗号分隔的列表,它可以正常工作,但如果 recipe_ids 中实际上有一个列表,则 sql 服务器会将其解释为 varchar 而不是整数列表
将它们包装在 STRING_SPLIT 中会导致查询变得非常慢(增加了几秒钟的执行时间)
解决方案
将它们包装在 STRING_SPLIT 中会导致查询变得非常慢
但这是唯一可行的方法。
select *
from t
where c in ('1,2,3,4,5')
只是不做你想做的事。
推荐阅读
- c++ - use QModelIndex to set background of a QTreeWidgetItem
- c++ - 使用 QMap 并获取编译错误消息
- upgrade - MarkLogic 升级和步骤
- android - 如何以编程方式检查 VoLTE 启用
- javascript - 如何从第三方 REST API 获取数据并显示在页面上
- java - 如何在java中将`List`更改为`List of tuple`
- javascript - uuid - 默认导出 (ReactJS - JavaScript)
- c - 如何使大容量存储设备从固件只读到 Windows
- c# - 从基类实例化特定类型的派生类属性
- php - Laravel Blade 变量范围