2016-10-07 55 views
2

我是SQL新手,无法创建查询以查找表中最后一项,其中一列包含特定字符串的一部分。我有类似于数据库:SQL Server - 查找与特定值匹配的最后一行

Part Number | Description | Qty 
------------+-------------+----- 
    MO1  | Big Motor | 1 
    MO2  | Small Motor | 5 
    XYZ  | Garbage  | 1 
    BO1  | Big Bolt | 1 
    BO2  | Small Bolt | 2 

我正在寻找一种方式来查询该“型号”和“MO”开头的条目,则返回刚刚过去的条目(“MO2 /小电机/ 5“)。零件编号始终是连续的,但在格式正确的数字之间可能存在大量垃圾数据。我更习惯于使用Excel来处理Excel,在那里我可以通过以相反顺序搜索来“查找”字符串,但是我不知道如何在SQL中执行相同的操作。

+2

SQL表格表示*无序*集合。除非列中明确指定了排序,否则表中没有“最后一个条目”。 –

+1

你是什么意思''之间的'垃圾数据'?不只是MO1,MO2 - 也许MOjunkdata1,但总是以数字字符结尾? – sgeddes

+0

@GordonLinoff - 我想象的顺序是'partnumber'中的最后一个数字字符...... – sgeddes

回答

3

如果“最后一个”你的意思是开始MO最大的价值,那么你可以做:

select top 1 t.* 
from t 
where partnumber like 'MO%' 
order by partnumber desc  -- or some other column that specifies the ordering 

如果数字最终可能看起来像MO101,那么你可以做:

order by len(partnumber) desc, partnumber desc 
+0

这样做了,非常感谢! – user2059972

0

假设你可以在MO和数字编号之间junk data,那么这里有一个选项order by结束字符:

select top 1 * 
from yourtable 
where partnumber like 'mo%' 
order by cast(right(partnumber, patindex('%[^0-9 ]%',reverse(partnumber)) - 1) as int) desc 

使用reversepatindex你可以在字符串的结尾获得剩下的数字字符。然后right可以通过cast轻松订购结果。

+0

我相信我可能说错了,这个SQL代码正在通过MS Access使用,所以它不是SQL服务器?我问,因为我得到这个代码的语法错误。通过挖掘,我认为这是因为“Patindex()”需要更改为“InStr()”和“Reverse()”更改为“Strreverse()”。通过这些更改,代码可以运行但不会选择任何内容。我认为这是由于Access没有“%”和“^”运算符功能?在Access中有替代吗? – user2059972

0
SELECT 
    TOP 1 * 
FROM 
    {TableName} 
WHERE 
    [Part Number] LIKE '%MO%' 
ORDER BY 
    [Part Number] DESC 

的部分数字总是连续

部件编号顺序颠倒,然后选择第一个

如果你想“莫”要到

一个变量的变化
DECLARE 
    @PartSearch NVARCHAR(MAX) = **'Mo'** 
SELECT 
    TOP 1 * 
FROM 
    {TableName} 
WHERE 
    [Part Number] LIKE '%' + @PartSearch + '%' 
ORDER BY 
    [Part Number] DESC 

http://sqlfiddle.com/#!6/9385d/3

相关问题