我在这个TSQL(如运算符)中缺少什么?

时间:2011-07-31 22:37:20

标签: sql-server tsql pattern-matching

select c.* 
from syscolumns c join sysobjects o on o.id=c.id and o.name = 'orders'

返回

Id
Customer
Product
03-28-2011
04-04-2011
04-11-2011
04-18-2011

这是对的。但我只想要匹配模式99-99-9999的列。所以我尝试了这个where cast(o.name as varchar) like '%-%-%'没有返回任何结果。然后我尝试了这个:where cast(o.name as varchar) like 'P%'(我希望得到“产品”)并且它也没有返回任何东西。为什么???我应该使用什么语法来获取“日期”列?

谢谢!

2 个答案:

答案 0 :(得分:3)

对于你问题的每一部分......

日期模式匹配

您可以使用[0-9]指定范围。

所以对于99-99-9999你有

LIKE '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]'

对于日期,您也可以使用ISDATE或类似的内容来进一步限制

LIKE '[0-1][0-9]-[0-3][0-9]-2[0-9][0-9][0-9]'

列过滤器

这些条件永远不会都是真的,因为o.name

all
o.name = 'orders'

cast(o.name as varchar) like '%-%-%'
cast(o.name as varchar) like 'P%'

后者2应位于查询中的c.name

最后

使用较新的sys.columns和sys.objects。或者INFORMATION_SCHEMA.COLUMNS,这可能是最好的

答案 1 :(得分:0)

您正在转换为varchar而不提供长度。我相信默认值为1可以解释问题。

在演员陈述中提供如下长度。

varchar(50)

编辑:否。施法和转换的默认值为30。

http://msdn.microsoft.com/en-us/library/ms176089.aspx