请问怎么匹配这样的指令?

conan304 2008-07-11 02:16:39
靠,垃圾csdn,打了半天,忘记选择小类,打的内容全不见了。
表结构如下:
/*
declare @t table([id] int identity(1,1),number varchar(20),ordernumber varchar(50))
insert @t(number,ordernumber) select '10001','A,B,C%'
union all select '10002','KT%,0000,M'
union all select '10003','1,34,T,Y'
union all select '10004','I,O,P%'

select * from @t
/*

(所影响的行数为 4 行)

id number ordernumber
----------- -------------------- --------------------------------------------------
1 10001 A,B,C%
2 10002 KT%,0000,M
3 10003 1,34,T,Y
4 10004 I,O,P%

(所影响的行数为 4 行)
*/


现在需要实现这样的功能:
当用户发送A或者B到10001的时候,返回匹配。但是发送C到10001则不匹配,需要发送C+任意字符到10001才匹配。
同理的,发送KT+任意字符到10002则匹配,发送0000到10002也匹配。发送KT到10002不匹配。
我知道可以这样处理:
select *
from @t
where charindex(','+cast(@s as varchar)+',',','+ordernumber+',')>0 and number='10001'
/*
id number ordernumber
----------- -------------------- --------------------------------------------------
1 10001 A,B,C%

(所影响的行数为 1 行)
*/

但是这个匹配没有%号的,请问%号的匹配怎么处理??

另外现在还没建表,里面的%可以用其他字符代替。%就就是需要只要匹配任意一个字符。
谢谢大家。
...全文
229 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
Garnett_KG 2008-07-14
  • 打赏
  • 举报
回复
2005的.


DECLARE @s varchar(30)
set @s='KTasdfla'
WITH CTE
(
SELECT ordernumber,1 as S ,CHARINDEX(',',ordernumber) as E

UNION ALL

SELECT ordernumber,b.E+2,CHARINDEX(',',a.ordernumber,b.E+2)-1
FROM table a INNER JOIN CTE b
ON a.ordernumber=b.ordernumber
AND CHARINDEX(',',a.ordernumber+',',b.E+2)>0
)
SELECT * FROM table WHERE @s LIKE SUBSTRING(ordernumber,S,E-S+1)
hanjs 2008-07-12
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 conan304 的回复:]
帖子今天不能加分,明天加贴。
[/Quote]

declare @t table([id] int identity(1,1),number varchar(20),ordernumber varchar(50))
insert @t(number,ordernumber) select '10001','A,B,C%'
union all select '10002','KT%,0000,M'
union all select '10003','1,34,T,Y'
union all select '10004','I,O,P%'

这个表分开设计会好些,如'A,B,C%'拆成三条存放就可以了!!
律己修心 2008-07-12
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 fcuandy 的回复:]
把多个值拆出来再去匹配了。
表结构设计的不好。
[/Quote]

嗯,如果保持现在表结构就再考虑更好的方法吧

要么就像27楼那样输入数据,OHOH
hery2002 2008-07-11
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 fcuandy 的回复:]
把多个值拆出来再去匹配了。
表结构设计的不好。
[/Quote]
顶F.C.
-狙击手- 2008-07-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 perfectaction 的回复:]
我白写了
[/Quote]

呵呵
fcuandy 2008-07-11
  • 打赏
  • 举报
回复
把多个值拆出来再去匹配了。
表结构设计的不好。
conan304 2008-07-11
  • 打赏
  • 举报
回复
帖子今天不能加分,明天加贴。
律己修心 2008-07-11
  • 打赏
  • 举报
回复
set nocount on
declare @t table([id] int identity(1,1),number varchar(20),ordernumber varchar(50))
insert @t(number,ordernumber) select '10001','A,B,C%'
union all select '10002','KT%,0000,M'
union all select '10003','1,34,T,Y'
union all select '10004','I,O,P%'

if object_id('Tempdb..#t') is not null drop table #t
if object_id('Tempdb..#') is not null drop table #
select top 100 ID=Identity(int,1,1) into #t from syscolumns a,syscolumns b
select a.number,ordernumber=substring(a.ordernumber,b.ID,charindex(',',a.ordernumber+',',b.ID)-b.ID)
into #
from @t a,#t b
where charindex(',',','+a.ordernumber,b.ID)=b.ID

declare @s varchar(20),@d varchar(20)
set @s='C'--'KT','K'
set @d='10001'--'10002'
select * from @t t
where exists(
select 1 from #
where number=t.number
and number=@d
and left(ordernumber,charindex('%',ordernumber+'%')-1)=left(@s,charindex('%',ordernumber+'%')-1))

set nocount off
/*
id number ordernumber
1 10001 A,B,C%
*/
律己修心 2008-07-11
  • 打赏
  • 举报
回复
这个是保持你原有的表结构的


declare @t table([id] int identity(1,1),number varchar(20),ordernumber varchar(50))
insert @t(number,ordernumber) select '10001','A,B,C%'
union all select '10002','KT%,0000,M'
union all select '10003','1,34,T,Y'
union all select '10004','I,O,P%'

if object_id('Tempdb..#t') is not null drop table #t
if object_id('Tempdb..#') is not null drop table #
select top 100 ID=Identity(int,1,1) into #t from syscolumns a,syscolumns b
select a.number,ordernumber=substring(a.ordernumber,b.ID,charindex(',',a.ordernumber+',',b.ID)-b.ID)
into #
from @t a,#t b
where charindex(',',','+a.ordernumber,b.ID)=b.ID

declare @s varchar(20),@d varchar(20)
set @s='C'--'KT','K'
set @d='10001'--'10002'

select * from #
where number=@d
and left(ordernumber,charindex('%',ordernumber+'%')-1)=left(@s,charindex('%',ordernumber+'%')-1)
律己修心 2008-07-11
  • 打赏
  • 举报
回复
declare @t table([id] int identity(1,1),number varchar(20),ordernumber varchar(50))
insert @t(number,ordernumber) select '10001','A'
union all select '10001','B'
union all select '10001','C%'
union all select '10002','KT%'
union all select '10002','0000'
union all select '10002','M'

declare @s varchar(20),@d varchar(20)
set @s='C'--'KT','K'
set @d='10001'--'10002'

select * from @t
where number=@d
and left(ordernumber,charindex('%',ordernumber+'%')-1)=left(@s,charindex('%',ordernumber+'%')-1)
Garnett_KG 2008-07-11
  • 打赏
  • 举报
回复

declare @t table([id] int identity(1,1),number varchar(20),ordernumber varchar(50))
insert @t(number,ordernumber) select '10001','A,B,C%'
union all select '10002','KT%,0000,M'
union all select '10003','1,34,T,Y'
union all select '10004','I,O,P%'

select * from @t

declare @s varchar(20)
set @s='CKKK'

select *
from @t
where @s like PARSENAME(replace(ordernumber,',','.'),1)
OR @s like PARSENAME(replace(ordernumber,',','.'),2)
OR @s like PARSENAME(replace(ordernumber,',','.'),3)
OR @s like PARSENAME(replace(ordernumber,',','.'),4)
and number=10001


律己修心 2008-07-11
  • 打赏
  • 举报
回复
目前的想法是
这样建表(或者用你的表把字符拆开)

然后反过来比较

我有急事了


declare @t table([id] int identity(1,1),number varchar(20),ordernumber varchar(50))
insert @t(number,ordernumber) select '10001','A'
union all select '10001','B,C%'
union all select '10001','C%'
union all select '10002','KT%'
union all select '10002','0000'
union all select '10002','M'


先不要接铁
律己修心 2008-07-11
  • 打赏
  • 举报
回复
目前的想法是
这样建表(或者用你的表把字符拆开)

然后反过来比较

我有急事了

utpcb 2008-07-11
  • 打赏
  • 举报
回复
有点乱好好想想呵呵 俯卧撑 
wzy_love_sly 2008-07-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 conan304 的回复:]
我也觉得很麻烦,似乎没有什么好的解决方法。

晚上我来结贴,谢谢大家。
[/Quote]

别急哦,看看这帖我的答案,也是一种方式

http://topic.csdn.net/u/20080711/15/66639249-52d9-40c6-8f5c-131e49c1a6cf.html
一品梅 2008-07-11
  • 打赏
  • 举报
回复
declare @t table([id] int identity(1,1),number varchar(20),ordernumber varchar(50))
insert @t(number,ordernumber) select '10001','A,B,C%'
union all select '10002','KT%,0000,M'
union all select '10003','1,34,T,Y'
union all select '10004','I,O,P%'

declare @s varchar(50),@where varchar(50)
set @s='c%'
if right(@s,1)='%'
BEGIN
length=len(@s);
set @DimWhere=left(@s,length-1);
END
Else
@exactwhere=@s;

select *
from @t
where patindex(@DimWhere%,ordernumber)>0 or @exactwhere=ordernumber;
and number='10001'
律己修心 2008-07-11
  • 打赏
  • 举报
回复
先不要结贴
我要好好想想
nzperfect 2008-07-11
  • 打赏
  • 举报
回复
我白写了
一品梅 2008-07-11
  • 打赏
  • 举报
回复
看样子在用patindex匹配时,必须将数据中的%去掉,只能取除%的字符串部分
因为%是语法中的通配符,patindex中的第一个参数外围必须是%的形式.
conan304 2008-07-11
  • 打赏
  • 举报
回复
我也觉得很麻烦,似乎没有什么好的解决方法。

晚上我来结贴,谢谢大家。
加载更多回复(16)
用于windows下面的vim编辑器。 给喜欢vim的人使用。详细如下: 好吧,详细点,这里写出一些基本的命令: 【什么是vi】 vi就是linux命令行下的最著名的编辑器之一,(编辑器就是类似windows记事本的功能,不过vi功能比记事本强大无限倍!^_^),现在实际使用的都是vim,它是vi的改进版本,所以现在的vi基本上就是vim了。 【vi能做什么】 第一个功能不用多说,vi可以编辑文本文件。至于其他的功能,多得无法列举,我只说我所知的一些典型的功能应用: (1)编辑文本文件 (2)方便地阅读程序源代码 (3)当文件目录浏览器来用 (4)提供编程、调试环境 (5)利用vi执行一些脚本文件(vi有自己的脚本文件语法) (x)等等等等...... 【vi的操作模式】   vi具有两种基本模式,为输入模式(或插入模式、编辑模式)和指令模式(或命令模式)。输入模式下输入字符,文本就会显示在屏幕上;而指令模式下输入字符就解释为一个输入命令并执行,而不会显示相应的字符。理解指令模式最简单方式就是想象平时剪切、复制以及粘贴数据时所发生的情况。 使用[Esc]键可以停止当前操作(插入或者命令)重新回到指令模式,准备接受新的指令。如果本来就在指令模式下面,将会响铃一下。 【最基本的使用】 这里提供了使用vi得最基本的操作,能够实现大多数的编辑目的。如果你肯花几分钟把“最基本的使用”的内容都实践一下,那么你至少可以独立地在vim中朝你想要得方向“前进”了。如果你不想学习,那么就把它当作一个“字典”吧。 *用vi打开一个文件: 输入“vi filename”. 这里,filename就是你要打开的文件的名字,默认打开文件后vi处于指令模式。 *进入编辑模式编辑打开的文件: 输入“i”. 或输入“a”. 进入编辑模式后,你可以直接敲入想要输入的字符到文件,两者的区别是i在当前字符前面开始插入,a在当前字符后面开始插入。 *退出编辑模式: 输入“[Esc]”. 这样,将返回指令模式,准备接收你要传达给vi的指令并执行,如果之前已经在指令模式下,那么系统将响铃提醒一下。 **以下命令都是在命令模式下进行: *撤销修改: 输入“u”. 这里,相比以前的vi来说,vim支持多步撤销。 *恢复修改: 输入“[Ctrl]r”. 这里,和撤销命令相反,是撤销的撤销,也可多步。 *复制行到剪切板: 输入“yy”. *复制选定内容到剪切板: (1)输入“v”。 (2)按方向键将高亮选择的内容。 (3)输入“y”。 这里,开始输入v使vi临时进入了一个"选择模式",输入方向键可以选择,输入y将选择的内容复制剪切板。 *删除行: 输入“dd”. 注意,vi的删除等价于剪切,删除的内容会保存到剪切板中。 *删除选定内容: (1)输入“v”。 (2)按方向键将高亮选择的内容。 (3)输入“d”。 这里,开始输入v使vi临时进入了一个“选择模式”,输入方向键可以选择,输入d将选择的内容删除。 *粘贴: 输入“p”. 这样会将剪切板的内容粘贴到光标位置或者光标下一行。 *查找字符并定位到第一个匹配处: 输入“/character”. 这里character是待查找的字符,只要先输入/,再输入待查字符,最后回车即可定位到第一个匹配的字符处。 *定位到匹配查找的下一个字符处: 输入“n”. *定位到匹配查找的上一个字符处: 输入“N”. *保存文件: 输入“:w”. 注意w前面的':',输入':'之后,vim会将':'之后的输入解释为待执行的指令。 *退出: 输入“:q”. 这里,如果文件没有保存,将提示无法退出,除非你强制退出,不保存文件,或者保存退出。 *强制退出: 输入“:q!”. *保存退出: 输入“:wq”. 或输入“ZZ”. *察看帮助 输入":help". ** 另外还有一个简易的教程: 输入命令:vimtutor.

34,838

社区成员

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

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