Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用CASE语句时出现意外输出_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 使用CASE语句时出现意外输出

Sql 使用CASE语句时出现意外输出,sql,sql-server,tsql,Sql,Sql Server,Tsql,当我偶然发现这个场景时,我正在用case语句尝试一些随机的事情。第一条语句抛出错误,但第二条语句工作正常。有人能帮我理解一下这里的案例陈述的执行情况吗 SELECT CASE WHEN 1 = 1 THEN 'case 1' WHEN 2 = 2 THEN 2 ELSE 10 END SELECT CASE WHEN 1 = 1 THEN 1 WHEN 2 = 2 THEN 'case 2' ELS

当我偶然发现这个场景时,我正在用case语句尝试一些随机的事情。第一条语句抛出错误,但第二条语句工作正常。有人能帮我理解一下这里的案例陈述的执行情况吗

SELECT CASE WHEN 1 = 1 THEN 'case 1'
            WHEN 2 = 2 THEN 2
            ELSE 10 END

SELECT CASE WHEN 1 = 1 THEN 1
            WHEN 2 = 2 THEN 'case 2'
            ELSE 10 END

当运算符组合两个不同数据类型的表达式时,数据类型优先级规则指定优先级较低的数据类型转换为优先级较高的数据类型。如果转换不是受支持的隐式转换,则返回错误(MSDN)

INT
的优先级高于
varchar
,因此它尝试
“案例1”转换为
INT

试试这个,你就会得到输出

SELECT case when 1=1 then 'case 1' when 2=2 then '2' else '10' END

SELECT case when 1=1 then 1 when 2=2 then 'case 2' else 10 END
更多解释


对于数据类型优先级

当运算符组合两个不同数据类型的表达式时,数据类型优先级规则指定将优先级较低的数据类型转换为优先级较高的数据类型。如果转换不是受支持的隐式转换,则返回错误(MSDN)

INT
的优先级高于
varchar
,因此它尝试
“案例1”转换为
INT

试试这个,你就会得到输出

SELECT case when 1=1 then 'case 1' when 2=2 then '2' else '10' END

SELECT case when 1=1 then 1 when 2=2 then 'case 2' else 10 END
更多解释


对于数据类型优先级

来说,返回值的所有类型都应该是相同的

您还可以在链接中看到另一个链接,该链接讨论了优先级,以确定将在case语句中使用哪种类型的sql。在您的例子中,使用的类型是int,因为它的优先级高于text

由于满足第一个条件,第二个命令起作用。但如果您尝试将其设为false,例如“选择case when 1=2,然后选择case 1 when 2=2,然后选择'case 2',否则10结束”。它将与命令1具有相同的错误,因为它将使用违反类似类型规则的返回类型文本对条件2求值为true


简而言之,错误是由于没有相同的

返回值的所有类型都应该是相同的读取

您还可以在链接中看到另一个链接,该链接讨论了优先级,以确定将在case语句中使用哪种类型的sql。在您的例子中,使用的类型是int,因为它的优先级高于text

由于满足第一个条件,第二个命令起作用。但如果您尝试将其设为false,例如“选择case when 1=2,然后选择case 1 when 2=2,然后选择'case 2',否则10结束”。它将与命令1具有相同的错误,因为它将使用违反类似类型规则的返回类型文本对条件2求值为true


简而言之,错误是由于没有相同的

case语句不能返回多个单一类型。当混合使用int和varchar等类型时,int类型具有更高的优先级,因此将是case语句返回类型的选择类型。有关数据类型优先级的列表,请参见

如果尝试返回第二个值(
“case2”
),则第二个case语句将失败;例如:

SELECT case when 1=0 then 1 when 2=2 then 'case 2' else 10 END

case语句不能返回多个单一类型。当混合使用int和varchar等类型时,int类型具有更高的优先级,因此将是case语句返回类型的选择类型。有关数据类型优先级的列表,请参见

如果尝试返回第二个值(
“case2”
),则第二个case语句将失败;例如:

SELECT case when 1=0 then 1 when 2=2 then 'case 2' else 10 END