sql - IF子查询需要测试几个值
问题描述
如何拆分字符串以便访问项目 x?- 解决方案已使用CTE
和WHILE
。我告诉我的请求没有使用 WHILE,因为这不是很好的性能,它会延迟速度.. 同样适用CURSOR
我正在使用 SQL Server 2012。我将获得一串 id ( @IDs
),需要针对某个值(在本例中为 1)进行测试。
IF (SELECT CycleId
FROM TABLE1
WHERE ID in (@IDs) ) = '1'
BEGIN
-- ABORT TRANSACTION AND FINISH THE QUERY
END
ELSE
BEGIN
-- START TRANSACTION FOR THE Id....
END
这不起作用。有人告诉我应该避免使用WHILE
or 。CURSOR
我需要运行 @Ids 中存在的几个值(它可以是 100 个值,也可以是 5 个用逗号分隔的值)。如果这些 Id 中至少有一个具有 CycleId=1,它应该完全停止操作。也许它可能是...
BEGIN
RAISERROR ('It is not possible to complete the transaction.',20,1)
BREAK
END
第一种情况:
@IDs = 121, 434, 543, 345
Id CycleId
---------------
121 1
434 2
543 1
345 1
在这种情况下,操作应该在@Id 121 处停止(它不应该读取/测试任何其他 ID,它应该像我之前展示的那样抛出错误)
第二种情况
@IDs = 121, 434, 543, 345
Id CycleId
--------------
121 3
434 2
543 5
345 6
在这种情况下,操作应该执行事务。
谢谢!
解决方案
假设您的字符串变量@ids
看起来像这样:' 2, 4 , 5 , 7,8,9,10, 21,22'
,您可以尝试以下操作:
-- pre-condition @ids by removing blanks and adding a comma at either end:
select @ids=','+replace(@ids,' ','')+',';
IF (SELECT 1 FROM TABLE1 WHERE patindex(concat('%,',CycleId,',%',@ids)>0 )
BEGIN
-- ABORT TRANSACTION AND FINISH THE QUERY
END
ELSE
BEGIN
-- START TRANSACTION FOR THE Id....
END
推荐阅读
- html - 如何删除难看的表格单元格边框?
- filehelpers - 有没有办法检索 FileHelpers Engine 正在解析的整行
- asynchronous - 使用带有 ListView.builder 的 FutureBuilder 初始化 App 并在每个 ListItem 中有一个 onClick?
- python - 在Python中满足条件时如何运行x命令y秒?
- android - 我如何自定义 android 工具栏形状
- angular - 为什么 source-maps 标志会影响 Angular 7 中的代码覆盖率报告?
- c - 为什么这种冒泡排序是错误的?
- python - 熊猫 fillna() 就地不使用 .loc
- scala - 如何避免可变集合的意外突变?
- android - 我的 AndroidManifest.xml 中的“.lifecycle-trojan”是什么