Rav*_*avi 4 sql-server-2008 sql-server
我试图从一个表中检索数据,其中有项目代码,由前三个数字标识,其余的都是唯一的。因此,例如,查询是:
SELECT * FROM
TableA
WHERE LEFT(acccode,3) IN ('121','131','141','151','161')
Run Code Online (Sandbox Code Playgroud)
现在,我希望这个条件对于所有这些代码都成立,除了一个。说,对于第一个,我希望它看起来像“121-111%”这样的四个字符。我如何才能在那里更改我的IN操作员,或者我是否必须LIKE使用类似以下内容的操作员:
SELECT * FROM
TableA
WHERE acccode LIKE '121-111%'
OR acccode LIKE '131%'...
Run Code Online (Sandbox Code Playgroud)
等等...?
澄清一下:以 121-111、131、141、151、161 开头的代码是我想要选择的代码。
所有列都是nvarchar.
Mar*_*ith 10
什么意义上的“更好”?
该LIKE版本是 sargable,因为您没有前导通配符并且可以使用索引查找,因此在这方面更好。
在这种情况下,您也可以考虑
SELECT * FROM
TableA
WHERE acccode LIKE '1[3-6]1%'
OR acccode LIKE '121-111%'
Run Code Online (Sandbox Code Playgroud)
作为一种简化,虽然完全扩展的版本可能更有效。
如果您没有有用的索引,您可能更喜欢使用
SELECT * FROM
TableA
WHERE LEFT(acccode,3) IN ('131','141','151','161')
OR acccode LIKE '121-111%'
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,似乎都隐藏着某种意义acccode,最好将其存储在单独的列中。