【转】SQL SERVER标量表达式的隐式转换

在SQL Server中的数据类型中,存在着优先级的问题.标量表达示的返回结果类型也会根据操作数的类型而定,如1 +'1'=2.而不是'11',因些Int型的优先级比VARCHAR型的优先级要高.所以在表达示的结果隐式转换成Int型.

同样对于标量函数,如一个表的一列是Int型,表中有两行值为2和3如果对这一列使用AVG函数,则结果是2,而不是2.5.但是如果这一列是Decimal类型的话,那么结果就是2.5.因为结果类型依据操作数据类型.

如下的一个Case语名

CASE

WHEN <logical_expression1> THEN <int_expression>

WHEN <logical_expression2> THEN <varchar_expression>

WHEN <logical_expression3> THEN <decimal_expression>

END

返回值的类型就为Decimal型,即使第一个表达示满足条件.

但是

SELECT

CASE

WHEN 1 > 1 THEN 10

WHEN 1 = 1 THEN ‘abc‘

WHEN 1 < 1 THEN 10.1

END

这个就会出现语法错误,

这时可以使用SQL_VARIANT类型,

SELECT  CASE    WHEN 1 > 1 THEN CAST(10 AS SQL_VARIANT)    WHEN 1 = 1 THEN CAST(‘abc‘ AS SQL_VARIANT)    WHEN 1 < 1 THEN CAST(10. AS SQL_VARIANT)  END;
时间: 2024-12-11 07:03:34

【转】SQL SERVER标量表达式的隐式转换的相关文章

SQL Server中提前找到隐式转换提升性能的办法

    http://www.cnblogs.com/shanksgao/p/4254942.html 高兄这篇文章很好的谈论了由于数据隐式转换造成执行计划不准确,从而造成了死锁.那如果在事情出现之前发现了这类潜在的风险岂不是更好?     那么我们来看一个简单的例子,如代码清单1所示.   1: SELECT * 2: FROM HumanResources.Employee 3: WHERE NationalIDNumber = 243322160 4:  5: SELECT * 6: FR

SQL Server有意思的数据类型隐式转换问题

写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类.这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题.我们先构造测试数据,如下所示: CREATE TABLE TEST (   ID    INT,   GOOD_TYPE  VARCHAR(12),   GOOD_WEIGHT NUMERIC(18,2) )   INSERT INTO dbo.TEST VALUES( 1, 'T1',1.27) SELECT  GOOD_TYPE,

SQL Server优化器特性-隐式谓词

原文:SQL Server优化器特性-隐式谓词 我们都知道,一条SQL语句提交给优化器会产生相应的执行计划然后执行输出结果,但他的执行计划是如何产生的呢?这可能是关系型数据库最复杂的部分了.这里我为大家介绍一个有关SQL Server优化器的特性-隐式谓词,并简单介绍在此特性下如何根据场景控制优化器的行为. 在这里我通过一个简单的实例来给大家说明下. code CREATE TABLE T1 (A INT, B INT) CREATE TABLE T2 (A INT, B INT) set sh

MySQL SQL优化之字符串索引隐式转换

之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结构: CREATE TABLE `test_1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` varchar(30) NOT NULL, `name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`),

SQL执行异常系列之——隐式转换

SQL> select object_id,CREATED from dba_objects where rownum < 10; OBJECT_ID CREATED ---------- ------------------ 20 25-JUL-18 46 25-JUL-18 28 25-JUL-18 15 25-JUL-18 29 25-JUL-18 3 25-JUL-18 25 25-JUL-18 41 25-JUL-18 54 25-JUL-18 9 rows selected. se

无法确定条件表达式的类型,因为Datetime和&lt;null&gt;之间没有隐式转换

Q: var a=isFilter ? ta.EndDate : null; Error:无法确定条件表达式的类型,因为Datetime和<null>之间没有隐式转换 ta.EndDate是DateTime类型,不能与null选择: A: var a=isFilter ? ta.EndDate : (DateTime?)null;//加在ta.EndDate也是可以的.

oracle 表字段类型,与业务SQL不合理,导致的隐式转换

今天遇到一个生产问题,业务SQL很简单,单表查询,而且表只有三个字段,有个主键ID,而且通过主键ID过滤,业务页面会传一百多个ID过来调用SQL,这个表数据量大小为100多万,但是偏偏这条SQL执行跑了15秒,完全影响业务不能使用. select a,b,c from t where t.id in (1111,222,333,444,555..........) 我一开始并没有去查看表设计,而是直接看了执行计划, 1 alter session set statistics_level=all

Java 条件表达式结果的隐式转换

public class IN0102 { public static void main(String[] args) { int a = 'a'; System.out.println(a);//97 float f = (float) 3.2; float sum =1.5f; int num=2; System.out.println((sum<2?1:num/sum));//1.0 System.out.println("-----------------------------

隐式转换

发现某一条语句消耗较高,执行比较频繁数据库版本如下将TextData语句拷贝到查询窗口执行将sp_executesql中的主体语句拷贝到查询窗口执行执行计划的总体流向是一致的,根据token得到LKLoginTokenRecord,然后嵌套循环AccountsInfoSimple.但是sp_executesql语句的执行计划有常量扫描和计算标量的操作,并且在索引查找中有谓词CONVERT_IMPLICIT(nvarchar(32),[DBname].[dbo].[LKLoginTokenReco