首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >修复丑陋且令人困惑的SQL where语句

修复丑陋且令人困惑的SQL where语句
EN

Stack Overflow用户
提问于 2010-05-14 05:16:55
回答 8查看 168关注 0票数 3

我直接向后端MS SQL Server查询软件包。关键字段(vehicle number)被定义为alpha,尽管我们在该字段中输入了数值。只有一个例外,当车辆退役时,我们在数字前面放一个"R“(这意味着我们把它卖了,或者这辆车是废弃的)。假设用户这样做是正确的,我们应该不会在使用这种方法时遇到问题。(对或错不是这里的问题)

快进到现在。我正在尝试查询这些车辆编号(800 - 899)的子集,以进行一些特殊处理。通过做一个从'800‘到'899’的范围,我们也可以得到80,81等。如果我将车辆编号转换成一个整数,我应该能够得到正确的范围。除了这些"R“型车正在踢我的臀部。

我已经尝试过where vehicleId not like 'R%' and cast(vehicleId as int) between 800 and 899,但是,我在这些"R“工具中的一个上得到了一个造型错误。

起作用的是where vehicleId not between '800' and '899' and cast(vehicleId as int) between 800 and 899',但我觉得必须有一种更好的方法和更少的混乱。

我还尝试了使用HAVING和一个子查询的其他变体,所有这些都会产生强制转换错误。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-05-14 05:29:15

这应该可以做到这一点,尽管它没有经过测试:

代码语言:javascript
复制
where cast(replace(vehicleId,'R','') as int) between 800 and 899
票数 6
EN

Stack Overflow用户

发布于 2010-05-14 05:24:55

使用_运算符而不是%运算符:

代码语言:javascript
复制
WHERE vehicleId LIKE 'R8__' OR vehicleId LIKE '8__'

您也可以像这样组合它们:

代码语言:javascript
复制
WHERE vehicleId LIKE '%8__'
票数 5
EN

Stack Overflow用户

发布于 2010-05-14 05:33:00

不能保证优化器将以正确的顺序执行这些操作(SQL中目前没有短路评估):

代码语言:javascript
复制
where vehicleId not like 'R%' and cast(vehicleId as int) between 800 and 899 

因此,强制转换可能会失败。

试试这个:

代码语言:javascript
复制
WHERE
    CASE
        WHEN vehicleId NOT LIKE 'R%' THEN
            CAST(vehicleId as int)
        ELSE
            0
    END BETWEEN 800 AND 899 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2830373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档