2013-03-06 175 views
1

我有点困惑于如何做这件事情。 我有这些值的数据库表:SQL LIKE(反向)

| id | file_type | code | position | 
------------------------------------- 
| 1 | Order | SO | 1  | 
| 2 | Order | 1-SO | 7  | 
| 3 | Order | 1_SO | 7  | 

现在,我想要得到的位置和我的文件名的文件类型,所以我想出了这个查询:

SET @FileName = '1-SO1234567890.pdf' 

SELECT * 
FROM tbl_FileTypes 
WHERE CHARINDEX(code,@FileName)> 0 

可悲的是,我在这里得到两个结果,我只需要具有“1-SO”结果的数据。

| id | file_type | code | position | 
------------------------------------- 
| 1 | Order | SO | 1  | 
| 2 | Order | 1-SO | 7  | 

我相信我的WHERE子句会导致这种情况发生。 有没有更好的方式让我获得我想要的结果?

非常感谢您提前。

+6

我是否严重误解了某些东西,或者应该是“SET @FileName ='1-SO1234567890.pdf''? – LittleBobbyTables 2013-03-06 14:42:54

+0

哎呀!我的坏,我现在纠正它。谢谢LittleBobbyTables。 – SyntaxError 2013-03-06 14:45:05

+1

你是测试它'StartsWith'的代码,还是应该是最长的匹配代码或其他东西?基本上,目前还不清楚为什么'1-SO'比'SO'更好匹配 - 请澄清。 – 2013-03-06 14:45:49

回答

2

您可能需要使用SUBSTRING代替(假定T-SQL):

WHERE code = SUBSTRING(@FileName,1, LEN(code)); 

如果FileName第一n个字符等于给定code,检查。

DEMO

+0

非常感谢。这件事情起作用!更多的权力给你添Tim Schmelter。 :) – SyntaxError 2013-03-06 14:58:07

+0

注意与我的解决方案相同的问题。如果你有两个代码1-SO 1_S,这将返回两个,如果该文件是'1-SO .....' – 2013-03-06 15:02:53

0

以及

SET @FileName = '1-SO1234567890.pdf' 

SELECT * 
FROM tbl_FileTypes 
WHERE CHARINDEX(code,@FileName) = 1 

将工作在这种情况下,但如果你有一个代码 '1-SOS' 这将再次失败。

+0

nice rep.6更多去... – Bastardo 2013-03-06 15:04:50

+0

我已经超过了10K,那么给予的用户我的点被删除。不公平:(:( – 2013-03-06 15:53:48

+0

大声笑,我失去了至少100像这样的代表。这是不好的。 – Bastardo 2013-03-06 16:22:48

0

既然你是cheking left most characters,你也可以使用LEFT()函数如下。还可以使用TOP (1)获取单个记录,并根据需要考虑订购。

SELECT TOP (1) * 
FROM tbl_FileTypes 
WHERE LEFT(@FileName,LEN(code)) = code 
--ORDER BY yourCol