抽出中间的内容,再按成份百分比做between

wufanglu 2010-03-02 12:24:02
如何快速找出类似:select * from MaterialMaster where Description.SPANDEX between '4' and '6'
即列出 MAT03, MAT04, MAT05, MAT4999 这四条记录。
难点在于可能要先拆分(以+号分隔)才能between。

CODE Description
--------------------------------------
MAT01 52%NYLON+8%SPANDEX+40%COTTON
MAT02 53%NL+7%SPANDEX+40%COTTON
MAT03 24%NYLON+6%SPANDEX+70%COTTON
MAT04 55%NYLON+5%SPANDEX+40%COTTON
MAT05 36%NL+4%SPANDEX+60%COTTON
MAT06 57%NYLON+3%SPANDEX+40%COTTON
MAT07 58%NL+2%SPANDEX+40%COTTON
...
MAT4999 36%NL+4%SPANDEX+60%COTTON
MAT5000 36%NL+8%SPANDEX+60%COTTON
...全文
139 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbsphixy 2010-03-03
  • 打赏
  • 举报
回复
还真有点麻烦..............
wufanglu 2010-03-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 happy_stone 的回复:]
SQL codeifnotobject_id('tb')isnulldroptable tbGoCreatetable tb([code]nvarchar(5),[Description]nvarchar(28))Insert tbselect N'MAT01',N'52%NYLON+8%SPANDEX+40%COTTON'unionallselect N'MAT02',N'53%NL+7%SPANDEX+40%COTTON'unionallselect N'MAT03',N'24%NYLON+6%SPANDEX+70%COTTON'unionallselect N'MAT04',N'55%NYLON+5%SPANDEX+40%COTTON'unionallselect N'MAT05',N'36%NL+4%SPANDEX+60%COTTON'unionallselect N'MAT06',N'57%NYLON+3%SPANDEX+40%COTTON'unionallselect N'MAT07',N'58%NL+2%SPANDEX+40%COTTON'GoSelect*from tbwheresubstring([Description],charindex('+',[Description])+1,charindex('%',[Description],charindex('%',[Description])+1)-charindex('+',[Description])-1)between4and6/*
CODE Description
----- ----------------------------
MAT03 24%NYLON+6%SPANDEX+70%COTTON
MAT04 55%NYLON+5%SPANDEX+40%COTTON
MAT05 36%NL+4%SPANDEX+60%COTTON

(3 個資料列受到影響)*/
[/Quote]

哈。刚才无意中看到parsename函数,这样也可以:
if not object_id('tb') is null
drop table tb
Go
Create table tb([CODE] nvarchar(5),[Description] nvarchar(28))
Insert tb
select N'MAT01',N'52%NYLON+8%SPANDEX+40%COTTON' union all
select N'MAT02',N'53%NL+7%SPANDEX+40%COTTON' union all
select N'MAT03',N'24%NYLON+6%SPANDEX+70%COTTON' union all
select N'MAT04',N'55%NYLON+5%SPANDEX+40%COTTON' union all
select N'MAT05',N'36%NL+4%SPANDEX+60%COTTON' union all
select N'MAT06',N'57%NYLON+3%SPANDEX+40%COTTON' union all
select N'MAT07',N'58%NL+2%SPANDEX+40%COTTON'
Go
/*
Select *
from tb
where
substring([Description],
charindex('+',[Description])+1,
charindex('%',[Description],charindex('%',[Description])+1)
-
charindex('+',[Description])
-1)
between 4 and 6
*/

select * from
(
Select *,
reverse( parsename( reverse(replace(Description,'+','.')) ,1) ) as f1, --把分隔符换成".", 取反, 取分隔的第n节,再取反回来
reverse( parsename( reverse(replace(Description,'+','.')) ,2) ) as f2,
reverse( parsename( reverse(replace(Description,'+','.')) ,3) ) as f3,
reverse( parsename( reverse(replace(Description,'+','.')) ,4) ) as f4,
reverse( parsename( reverse(replace(Description,'+','.')) ,5) ) as f5
from tb
) a
where substring(f2, 1, charindex('%',f2)-1) between 4 and 6
wufanglu 2010-03-03
  • 打赏
  • 举报
回复
用charindex定位还真有点麻烦,肯定打扰了版主不少时间。
wufanglu 2010-03-03
  • 打赏
  • 举报
回复
哇,正解呀。谢了 回复内容太短了!
快乐_石头 2010-03-03
  • 打赏
  • 举报
回复
if not object_id('tb') is null
drop table tb
Go
Create table tb([CODE] nvarchar(5),[Description] nvarchar(28))
Insert tb
select N'MAT01',N'52%NYLON+8%SPANDEX+40%COTTON' union all
select N'MAT02',N'53%NL+7%SPANDEX+40%COTTON' union all
select N'MAT03',N'24%NYLON+6%SPANDEX+70%COTTON' union all
select N'MAT04',N'55%NYLON+5%SPANDEX+40%COTTON' union all
select N'MAT05',N'36%NL+4%SPANDEX+60%COTTON' union all
select N'MAT06',N'57%NYLON+3%SPANDEX+40%COTTON' union all
select N'MAT07',N'58%NL+2%SPANDEX+40%COTTON'
Go
Select *
from tb
where substring([Description],charindex('+',[Description])+1,charindex('%',[Description],charindex('%',[Description])+1)-charindex('+',[Description])-1)
between 4 and 6
/*
CODE Description
----- ----------------------------
MAT03 24%NYLON+6%SPANDEX+70%COTTON
MAT04 55%NYLON+5%SPANDEX+40%COTTON
MAT05 36%NL+4%SPANDEX+60%COTTON

(3 個資料列受到影響)
*/
wufanglu 2010-03-03
  • 打赏
  • 举报
回复
布料的成份就是这样的,这原本仅是个描述,原先是很乱的,我先要求他们整理成统一的口径,且要有规律,
我再根据规律一步一步想办法。

现在看来要在后面增加辅助字段,把成份与其对应的百分比拆开,不然between语句根本就用不进去,即使能用也满足不了速度要求。
  • 打赏
  • 举报
回复
这个表建的是太绝了。
wufanglu 2010-03-03
  • 打赏
  • 举报
回复
再ding 回复内容太短了
wufanglu 2010-03-02
  • 打赏
  • 举报
回复
用户是要“火石闪电”的速度,只要一输入“5%SPANDEX”,马上就要给他列出“5%土1”的“SPANDEX”。用自定义函数显然是达不到速度要求。
wufanglu 2010-03-02
  • 打赏
  • 举报
回复
自己顶 回复内容 回复内容太短了!

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧