使用如下脚本来查询表中数据:
代码
DECLARE @FirstName NVARCHAR(),@LastNameNVARCHAR();SELECT @FirstName = "",@LastName = "";SELECT *FROMEmployees cWHERE CHARINDEX((CASEWHEN @FirstName = "" THEN FirstName ELSE @FirstName END ), FirstName ) >AND CHARINDEX( (CASE WHEN @LastName = "" THEN LastName ELSE @LastName END), LastName ) >执行后会发现查出的结果和图1一样。
如果我们再把第三行的@LastName变量赋值为"d"试试,结果会把所有FirstName字段包含"n"并且LastName字段包含"d"的记录查出来,如下图:
通过以上例子我们可以看到,通过给两个变量传递不同的值,就可以根据多条件进行模糊查询了,如果把上面的语句写在存储过程中,就可以不必再拼接SQL语句了,也不会出现注入式问题了。
以上脚本的简单说明:用charindex函数替换like,避免拼接sql语句;使用case when 语句,当传递的参数值为空字符串时让条件始终为真,即等于忽略该条件,不为空串时按参数值模糊查询。
以上是工作中的经验总结,希望对大家有帮助。有关case when还有一些比较实用的用法,有时间的话再写写。
下面给大家介绍SQL CASE 多条件用法
Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数CASE sex WHEN "" THEN "男" WHEN "" THEN "女"ELSE "其他" END--Case搜索函数CASE WHEN sex = "" THEN "男" WHEN sex = "" THEN "女"ELSE "其他" END这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
CASE WHEN col_ IN ( "a", "b") THEN "第一类" WHEN col_ IN ("a")THEN "第二类"ELSE"其他" END下面我们来看一下,使用Case函数都能做些什么事情。
SELECT SUM(population),CASE countryWHEN "中国" THEN "亚洲"WHEN "印度" THEN "亚洲"WHEN "日本" THEN "亚洲"WHEN "美国" THEN "北美洲"WHEN "加拿大" THEN "北美洲"WHEN "墨西哥" THEN "北美洲"ELSE "其他" ENDFROMTable_AGROUP BY CASE countryWHEN "中国" THEN "亚洲"WHEN "印度" THEN "亚洲"WHEN "日本" THEN "亚洲"WHEN "美国" THEN "北美洲"WHEN "加拿大" THEN "北美洲"WHEN "墨西哥" THEN "北美洲"ELSE "其他" END;同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下;
SELECTCASE WHEN salary <= THEN "" WHEN salary > AND salary <=THEN "" WHEN salary > AND salary <=THEN "" WHEN salary > AND salary <= THEN ""ELSE NULL END salary_class,COUNT(*)FROMTable_AGROUP BYCASE WHEN salary <= THEN "" WHEN salary > AND salary <=THEN "" WHEN salary > AND salary <=THEN "" WHEN salary > AND salary <= THEN ""ELSE NULL END;二,用一个SQL语句完成不同条件的分组。
SELECT country,SUM( CASE WHEN sex = "" THENpopulation ELSE END), --男性人口SUM( CASE WHEN sex = "" THENpopulation ELSE END)--女性人口FROM Table_AGROUP BY country;这样我们使用Select,完成对二维表的输出形式,充分显示了Case函数的强大。
CONSTRAINT check_salary CHECK( CASE WHEN sex = "" THEN CASE WHEN salary > THEN ELSE END ELSE END = )如果单纯使用Check,如下所示
CONSTRAINT check_salary CHECK( sex = "" AND salary > )