SQL case 语句:如果为空则返回指定的字符串,否则返回选择值
Posted
技术标签:
【中文标题】SQL case 语句:如果为空则返回指定的字符串,否则返回选择值【英文标题】:SQL case statement: Return specified string if null else return select value 【发布时间】:2018-02-06 20:33:55 【问题描述】:下面是我的 sql 代码的摘录,如果 select 语句的值为 null,我试图返回一个字符串“校外”。如果值不为空,我想返回值本身。但是,我收到一个错误:ORA-00904: "SITE_DESC": invalid identifier 00904. 00000 - "%s: 无效标识符"
请告诉我如何解决这个问题。
WHEN 'S' THEN (
case when(SELECT
site_desc
FROM
building
WHERE
site_code = (
SELECT
code
FROM
table2
WHERE
name = 'code'
)
) is null then 'Off-Campus' else site_desc end
)
WHEN 'F' THEN (
.... ...... .......
)
【问题讨论】:
你有几个工具可用于你想要的......存在和合并函数是一些例子 【参考方案1】:试试COALESCE
:
WHEN 'S'
THEN
COALESCE(SELECT
site_desc
FROM
building
WHERE
site_code = (
SELECT
code
FROM
table2
WHERE
name = 'code'
),'Off-Campus')
【讨论】:
我不是预言机专家,但WHERE site_code = (SELECT code FROM...
不会因为返回值中存在多个可能值而出现问题吗?不应该SELECT TOP 1 code...
来保证标量结果或WHERE site_code IN (SELECT code...
来处理多个返回值吗?
当然多行匹配会报错。但这可能无论如何都基于主键,否则您必须决定返回哪一行。或者你改用EXISTS
。
谢谢,效果很好。我不知道 COALESCE
@jimguire 这可能对您不起作用,这取决于您选择的此处的外观(尽管这可能是由于对我们进行了消毒)如果保证 table2
中的 name
是唯一的,您没关系,如果不是,那么您会遇到返回多个代码的问题。看我的回答。【参考方案2】:
你可以使用COALESCE
:
WHEN 'S' THEN (
COALESCE(SELECT site_desc
FROM building
WHERE site_code IN (SELECT code
FROM table2
WHERE name = 'code'),
'Off-Campus')
或者:
WHEN 'S' THEN (
COALESCE(SELECT site_desc
FROM building
WHERE site_code = (SELECT TOP 1 code
FROM table2
WHERE name = 'code'),
'Off-Campus')
这两者之间的区别在于您如何处理最里面的子查询,因为它在您的 where 子句中,您可以测试您的值 site_code
是否为 IN
结果,或者仅通过采用 TOP 1
来保证一个结果和测试平等。即使您可以保证在table2
中只有一个name = 'code'
,这样做也是一种很好的做法。第一个选项可能更有用,因为它将返回 name='code' 的所有代码并测试 site_code 是否在结果中。
COALESCE(expression [,... expressionN])
遍历从左到右传入的表达式,对每个表达式求值,直到没有剩余值可以求值或找到一个返回 null 以外的值的表达式。您可以向它传递任意数量的参数,它将返回第一个不为空的参数。在您的情况下,第二个表达式是硬编码字符串,第一个是可能返回 null 的子选择。
【讨论】:
【参考方案3】:你可以用coalesce()
写这个:
WHEN 'S'
THEN coalesce( (SELECT site_desc
FROM building
WHERE site_code = (SELECT code FROM table2 WHERE name = 'code')
), 'Off-Campus'
)
我不能说我是嵌套子查询的粉丝,所以可能有一种更简单的方式来表达逻辑。
【讨论】:
加入可以绕过嵌套的子查询,但这需要更多的实际查询来编写......以上是关于SQL case 语句:如果为空则返回指定的字符串,否则返回选择值的主要内容,如果未能解决你的问题,请参考以下文章
php+mysql多字段同时修改,如果传来的值为空则不修改,php该用哪种方法最好?