1 假设你想建立一个与Yahoo功能相似的Internet目录。你可以建立一个表用来保存一系列的站点名称,统一资源定位器(URL),描述,和类别,并答应访问者通过在HTML form中输入要害字来检索这些内容。 2 假如有一个访问者想从这个目录中得到其描述中包含要害字trading card的站点的列表。要取出正确的站点列表,你也许试图使用这样的查询: 3 4 SELECT site_name FROM site_directory WHERE site_desc=’trading card’ 5 6 这个查询可以工作。但是,它只能返回那些其描述中只有trading card这个字符串的站点。例如,一个描述为We have the greatest collection of trading cards in the world!的站点不会被返回。 7 要把一个字符串与另一个字符串的一部分相匹配,你需要使用通配符。你使用通配符和要害字LIKE来实现模式匹配。下面的语句使用通配符和要害字LIKE重写了上面的查询,以返回所有正确站点的名字: 8 9 SELECT SITE_name FROM site_directory WHERE site_desc LIKE ‘%trading cark%’ 10 11 在这个例子中,所有其描述中包含表达式trading card的站点都被返回。描述为We have the greatest collection of trading cards in the world!的站点也被返回。当然,假如一个站点的描述中包含I am trading cardboard boxes online ,该站点的名字也被返回。 12 注重本例中百分号的使用。百分号是通配符的例子之一。它代表0个或多个字符。通过把trading card括在百分号中,所有其中嵌有字符串trading card的字符串都被匹配。 13 现在,假设你的站点目录变得太大而不能在一页中完全显示。你决定把目录分成两部分。在第一页,你想显示所有首字母在A到M之间的站点。在第二页,你想显示所有首字母在N到Z之间的站点。要得到第一页的站点列表,你可以使用如下的SQL语句: 14 15 SELECT site_name FROM site_directory WHERE site_name LIKE ‘[A-M]%’ 16 17 在这个例子中使用了表达式[A-M],只取出那些首字母在A到M之间的站点。中括号([])用来匹配处在指定范围内的单个字符。要得到第二页中显示的站点,应使用这个语句: 18 19 SELECT site_name FROM site_directory WHERE site_name LIKE ‘[N-Z]%’ 20 21 在这个例子中,括号中的表达式代表任何处在N到Z之间的单个字符。 22 假设你的站点目录变得更大了,你现在需要把目录分成更多页。假如你想显示那些以A,B或C开头的站点,你可以用下面的查询来实现: 23 24 SELECT site_name FROM site_directory WHERE site_name LIKE ‘[ABC]%’ 25 26 在这个例子中,括号中的表达式不再指定一个范围,而是给出了一些字符。任何一个其名字以这些字符中的任一个开头的站点都将被返回。 27 通过在括号内的表达式中同时包含一个范围和一些指定的字符,你可以把这两种方法结合起来。例如,用下面的这个查询,你可以取出那些首字母在C到F之间,或者以字母Y开头的站点: 28 29 SELECT site_name FROM site_directory WHERE site_name LIKE ‘[C-FY]%’ 30 31 在这个例子中,名字为Collegescape和Yahoo的站点会被选取,而名字为Magicw3的站点则不会被选取。 32 你也可以使用脱字符(^)来排除特定的字符。例如,要得到那些名字不以Y开头的站点,你可以使用如下的查询: 33 34 SELECT site_name FROM site_directory WHERE site_name LIKE ‘[^Y]%’ 35 36 对给定的字符或字符范围均可以使用脱字符。 37 最后,通过使用下划线字符(_),你可以匹配任何单个字符。例如,下面这个查询返回每一个其名字的第二个字符为任何字母的站点: 38 39 SELECT site_name FROM site_directory WHERE site_name LIKE ‘M_crosoft’ 40 41 这个例子既返回名为Microsoft的站点,也返回名为Macrosoft的站点。但是,名字为Moocrosoft的站点则不被返回。与通配符’%’不同,下划线只代表单个字符。 42 43 注重: 44 假如你想匹配百分号或下划线字符本身,你需要把它们括在方括号中。假如你想匹配连字符(-),应把它指定为方括号中的第一个字符。假如你想匹配方括号,应把它们也括在方括号中。例如,下面的语句返回所有其描述中包含百分号的站点: 45 46 SELECT site_name FROM site_directory WHERE site_desc LIKE ‘%[%]%’ 47 48 匹配发音 49 Microsoft SQL 有两个答应你按照发音来匹配字符串的函数。函数SOUNDEX()给一个字符串分配一个音标码,函数DIFFERENCE()按照发音比较两个字符串。当你不知道一个名字的确切拼写,但多少知道一点它的发音时,使用这两个函数将有助于你取出该记录。 50 例如,假如你建立一个Internet目录,你也许想增加一个选项,答应访问者按照站点名的发音来搜索站点,而不是按名字的拼写。考虑如下的语句: 51 52 SELECT site_name FROM site_directory WHERE DIFFERENCE(site_name , ‘Microsoft’>3 53 54 这个语句使用函数DEFFERENCE()来取得其名字的发音与Microsoft非常相似的站点。函数DIFFERENCE()返回一个0到4之间的数字。假如该函数返回4,表示发音非常相近;假如该函数返回0,说明这两个字符串的发音相差很大。 55 例如,上面的语句将返回站点名Microsoft和Macrosoft。这两个名字的发音与Microsoft都很相似。假如你把上一语句中的大于3改为大于2,那么名为Zicrosoft和Megasoft的站点也将被返回。最后,假如你只需要差别等级大于1即可,则名为Picosoft和Minisoft的站点也将被匹配。 56 要深入了解函数DIFFERENCE()是如何工作的,你可以用函数SOUNDEX()来返回函数DIFFERENCE()所使用的音标码。这里有一个例子: 57 58 SELECT site_name ‘site name’,SOUNDEX(site_name) ‘sounds like’ 59 60 这个语句选取字段site_name的所有数据及其音标码。下面是这个查询的结果: 61 62 site name sounds like 63 ………………………………………………………………. 64 Yahoo Y000 65 Mahoo M000 66 Microsoft M262 67 Macrosoft M262 68 Minisoft M521 69 Microshoft M262 70 Zicrosoft Z262 71 Zaposoft Z121 72 Millisoft M421 73 Nanosoft N521 74 Megasoft M221 75 Picosoft P221 76 (12 row(s) affected) 77 78 假如你仔细看一下音标码,你会注重到音标码的第一个字母与字段值的第一个字母相同。例如,Yahoo和Mahoo的音标码只有第一个字母不同。你还可以发现Microsoft和Macrosoft的音标码完全相同。 79 函数DIFFERENDE()比较两个字符串的第一个字母和所有的辅音字母。该函数忽略任何元音字母(包括y),除非一个元音字母是一个字符串的第一个字母。 80 不幸的是,使用SOUNDEX()和DIFFERENCE()有一个欠缺。WHERE子句中包含这两个函数的查询执行起来效果不好。因此,你应该小心使用这两个函数。 81 82 删除空格 83 84 有两个函数,TTRIM()和LTRIM(),可以用来从字符串中剪掉空格。函数LTRIM()去除应该字符串前面的所有空格;函数RTRIM()去除一个字符串尾部的所有空格。这些和vbscript中的同名函数功能是一致的。 85 这里有一个任何使用函数RTRIM()的例子: 86 87 SELECT RTRIM(site_name) FROM site_directory 88 89 在这个例子中,假如任何一个站点的名字尾部有多余的空格,多余的空格将从查询结果中删去。 90 你可以嵌套使用这两个函数,把一个字符串前后的空格同时删去: 91 92 SELECT LTRIM(RTRIM(site_name) FROM site_directory 93 94 你会发现,在从CHAR型字段中剪掉多余的空格时,这两个函数非常有用。记住,假如你把一个字符串保存在CHAR型字段中,该字符串会被追加多余的空格,以匹配该字段的长度。用这两个函数,你可以去掉无用的空格,从而解决这个问题。 95 96 select 字段1 from 表1 where 字段1.IndexOf("云")=1; 97 这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。 98 left()是sql函数。 99 select 字段1 from 表1 where charindex('云',字段1)=1; 字符串函数对二进制数据、字符串和表达式执行不同的运算。此类函数作用于CHAR、VARCHAR、 BINARY、 和VARBINARY 数据类型以及可以隐式转换为CHAR 或VARCHAR的数据类型。可以在SELECT 语句的SELECT 和WHERE 子句以及表达式中使用字符串函数。 100 常用的字符串函数有: 101 102 一、字符转换函数 103 1、ASCII() 104 返回字符表达式最左端字符的ASCII 码值。在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错。 105 2、CHAR() 106 将ASCII 码转换为字符。如果没有输入0 ~ 255 之间的ASCII 码值,CHAR() 返回NULL 。 107 3、LOWER()和UPPER() 108 LOWER()将字符串全部转为小写;UPPER()将字符串全部转为大写。 109 4、STR() 110 把数值型数据转换为字符型数据。 111 STR (<float_expression>[,length[, <decimal>]]) 112 length 指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的length 值为10, decimal 缺省值为0。 113 当length 或者decimal 为负值时,返回NULL; 114 当length 小于小数点左边(包括符号位)的位数时,返回length 个*; 115 先服从length ,再取decimal ; 116 当返回的字符串位数小于length ,左边补足空格。 117 二、去空格函数 118 1、LTRIM() 把字符串头部的空格去掉。 119 120 2、RTRIM() 把字符串尾部的空格去掉。 121 122 三、取子串函数 123 1、left() 124 LEFT (<character_expression>, <integer_expression>) 125 返回character_expression 左起 integer_expression 个字符。 126 127 2、RIGHT() 128 RIGHT (<character_expression>, <integer_expression>) 129 返回character_expression 右起 integer_expression 个字符。 130 131 3、SUBSTRING() 132 SUBSTRING (<expression>, <starting_ position>, length) 133 返回从字符串左边第starting_ position 个字符起length个字符的部分。 134 135 已知: 字段A='F:photoWinter Leaves.jpg' 136 要求:分段截取每段字符[字段A不能为TEXT类型,否则报错] 137 解决方法: 138 +++++++++++++++++++++++++++++++++++++++++++++++++++ 139 140 141 ---截取字符串A的第一个左边的字符串 142 select left(A,charindex('/',A)-1) 143 输出结果:F: 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 145 146 ---截取中间的字符串 147 select left(stuff(A,1,charindex('/',A),''),charindex('/',stuff(A,1,charindex('/',A),''))-1) 148 输出结果:photo 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 150 151 152 ---截取最后一个后面的字符串 153 select reverse(left(reverse(A),charindex('/',reverse(A))-1)) 154 输出结果:Winter Leaves.jpg 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 156 157 ---截取字符串A的首字幕 158 select STUFF(A,1, 1, '') 159 输出结果::photoWinter Leaves.jpg 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 161 162 四、字符串比较函数 163 1、CHARINDEX() 164 返回字符串中某个指定的子串出现的开始位置。 165 CHARINDEX (<’substring_expression’>, <expression>) 166 其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回0 值。 167 此函数不能用于TEXT 和IMAGE 数据类型。 168 2、PATINDEX() 169 返回字符串中某个指定的子串出现的开始位置。 170 PATINDEX (<’%substring _expression%’>, <column_ name>)其中子串表达式前后必须有百分号“%”否则返回值为0。 171 与CHARINDEX 函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于CHAR、 VARCHAR 和TEXT 数据类型。 172 173 五、字符串操作函数 174 1、QUOTENAME() 175 返回被特定字符括起来的字符串。 176 QUOTENAME (<’character_expression’>[, quote_ character]) 其中quote_ character 标明括字符串所用的字符,缺省值为“[]”。 177 2、REPLICATE() 178 返回一个重复character_expression 指定次数的字符串。 179 REPLICATE (character_expression integer_expression) 如果integer_expression 值为负值,则返回NULL 。 180 181 3、REVERSE() 182 将指定的字符串的字符排列顺序颠倒。 183 REVERSE (<character_expression>) 其中character_expression 可以是字符串、常数或一个列的值。 184 185 4、REPLACE() 186 返回被替换了指定子串的字符串。 187 REPLACE (<string_expression1>, <string_expression2>, <string_expression3>) 用string_expression3 替换在string_expression1 中的子串string_expression2。 188 189 4、SPACE() 190 返回一个有指定长度的空白字符串。 191 SPACE (<integer_expression>) 如果integer_expression 值为负值,则返回NULL 。 192 193 5、STUFF() 194 用另一子串替换字符串指定位置、长度的子串。 195 STUFF (<character_expression1>, <start_ position>, <length>,<character_expression2>) 196 如果起始位置为负或长度值为负,或者起始位置大于character_expression1 的长度,则返回NULL 值。 197 如果length 长度大于character_expression1 中 start_ position 以右的长度,则character_expression1 只保留首字符。 198 六、数据类型转换函数 199 1、CAST() 200 CAST (<expression> AS <data_ type>[ length ]) 201 202 2、CONVERT() 203 CONVERT (<data_ type>[ length ], <expression> [, style]) 204 205 1)data_type为SQL Server系统定义的数据类型,用户自定义的数据类型不能在此使用。 206 2)length用于指定数据的长度,缺省值为30。 207 3)把CHAR或VARCHAR类型转换为诸如INT或SAMLLINT这样的INTEGER类型、结果必须是带正号或负号的数值。 208 4)TEXT类型到CHAR或VARCHAR类型转换最多为8000个字符,即CHAR或VARCHAR数据类型是最大长度。 209 5)IMAGE类型存储的数据转换到BINARY或VARBINARY类型,最多为8000个字符。 210 6)把整数值转换为MONEY或SMALLMONEY类型,按定义的国家的货币单位来处理,如人民币、美元、英镑等。 211 7)BIT类型的转换把非零值转换为1,并仍以BIT类型存储。 212 8)试图转换到不同长度的数据类型,会截短转换值并在转换值后显示“+”,以标识发生了这种截断。 213 9)用CONVERT()函数的style 选项能以不同的格式显示日期和时间。style 是将DATATIME 和SMALLDATETIME 数据转换为字符串时所选用的由SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格式。 214 七、日期函数 215 1、day(date_expression) 216 返回date_expression中的日期值 217 218 2、month(date_expression) 219 返回date_expression中的月份值 220 221 3、year(date_expression) 222 返回date_expression中的年份值 223 224 4、DATEADD() 225 DATEADD (<datepart>, <number>, <date>) 226 返回指定日期date 加上指定的额外日期间隔number 产生的新日期。 227 5、DATEDIFF() 228 DATEDIFF (<datepart>, <date1>, <date2>) 229 返回两个指定日期在datepart 方面的不同之处,即date2 超过date1的差距值,其结果值是一个带有正负号的整数值。 230 231 6、DATENAME() 232 DATENAME (<datepart>, <date>) 233 以字符串的形式返回日期的指定部分此部分。由datepart 来指定。 234 235 7、DATEPART() 236 DATEPART (<datepart>, <date>) 237 以整数值的形式返回日期的指定部分。此部分由datepart 来指定。 238 DATEPART (dd, date) 等同于DAY (date) 239 DATEPART (mm, date) 等同于MONTH (date) 240 DATEPART (yy, date) 等同于YEAR (date) 241 242 8、GETDATE() 243 以DATETIME 的缺省格式返回系统当前的日期和时间。