2013-03-06 176 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