【问题标题】:SQL - Return a default value when my search returns no results along with search criteriaSQL - 当我的搜索没有返回结果以及搜索条件时返回默认值
【发布时间】:2018-05-31 19:26:34
【问题描述】:

我正在使用查询进行搜索 --代码格式

SELECT COLA,COLB,COLC from MYTABLE where SWITCH IN (1,2,3);

如果MYTABLE 不包含SWITCH 1,2 或3 的行,我需要与SWITCH 值一起返回默认值。我该怎么做?

下面是我的表格格式

COLA | COLB | COLC | SWITCH
------------------------------
A       B      C        1
a       b      c        2

当我使用

进行搜索时,我想要一个查询
select * from MYTABLE where switch in (1,2,3)

得到这样的结果--

COLA | COLB | COLC | SWITCH
------------------------------
A       B      C        1
a       b      c        2
NA      NA     NA       3

【问题讨论】:

  • 如果没有符合条件的值,您希望默认值和结果集如何?
  • 基本上我试图找出我的表中没有行的 SWITCH 值。如果你想帮忙..
  • 也许您应该考虑发布一个示例表、示例数据和所需的输出。你有几个人在猜测,但不清楚你想要什么。这将是一个很好的起点。 spaghettidba.com/2015/04/24/…

标签: sql sql-server mssql-jdbc


【解决方案1】:
--Check to see if any row exists matching your conditions
IF NOT EXISTS (SELECT COLA,COLB,COLC from MYTABLE where SWITCH IN (1,2,3))
     BEGIN
         --Select your default values
     END
ELSE
     BEGIN
        --Found rows, return them
        SELECT COLA,COLB,COLC from MYTABLE where SWITCH IN (1,2,3)
     END

【讨论】:

  • 如果我有一个 switch =1 的行,这个查询返回 switch =1 的结果,我没有看到 switch=2 或 3 的任何记录;基本上我想知道我的表中没有记录的开关值
  • @Sudha 那么我认为这与您的查询有关,而不是我发布的内容,这只是评估您的给定查询是否存在任何记录,如果不存在,则选择返回默认值,否则它执行您提供的选择语句。
【解决方案2】:

如果不存在(SELECT 1 from MYTABLE where SWITCH IN (1,2,3)) 选择 default_value

【讨论】:

  • 所以我的表有4列,如上面的sql。如果我有 switch =1 的记录,我希望返回结果;如果我没有 switch = 2 的记录,我希望返回“不可用”之类的内容。这个 sql 对我不起作用
【解决方案3】:

怎么样:

SELECT COLA,COLB,COLC from MYTABLE where SWITCH IN (1,2,3)
union select 5555, 6666, 7777 where not exists (
  SELECT COLA,COLB,COLC from MYTABLE where SWITCH IN (1,2,3)
);

555566667777 是默认行,以防没有任何行符合您的条件。

【讨论】:

  • 此答案适用于我的 SWITCH 值在 1、2 或 3 之外的情况。当我的表中没有 SWITCH 值为 1 或 2 或 3 的行时,我需要一个解决方案
  • 第二次尝试。现在喜欢吗?
【解决方案4】:

这是解决此问题的一种方法。您需要一个要查看的 SWITCH 值表。然后一个简单的左连接让这变得超级简单。

select ColA
    , ColB
    , ColC
    v.Switch
from
(
    values
    (1)
    , (2)
    , (3)
)v (Switch)
left join YourTable yt on yt.Switch = v.Switch

【讨论】:

    【解决方案5】:

    您可以使用拆分函数和左连接,如下所示:

    Select ISNULL(ColA,'NA') As ColA,ISNULL(ColB,'NA') As ColB,ISNULL(ColC,'NA') As ColC,ISNULL(Switch,a.splitdata) 
    from [dbo].[fnSplitString]('1,2,3',',') a
    LEFT JOIN #MYTABLE t on a.splitdata=t.Switch
    

    [dbo].[fnSplitString] 是具有 2 个参数的拆分函数 - 分隔符分隔字符串和分隔符并输出一个表格。

    【讨论】:

      【解决方案6】:

      编辑: 鉴于新的解释,我完全改变了答案。我想我现在明白了你的问题:

      SELECT * FROM MYTABLE AS mt
      RIGHT JOIN (SELECT 1 AS s UNION SELECT 2 AS s UNION SELECT 3 AS s) AS st
      ON st.s = mt.SWITCH
      

      您可以将SELECT 1 AS s UNION SELECT 2 AS s UNION SELECT 3 AS spart 更改为一个子查询,该子查询会产生SWITCH 可以假定的所有可能值。例如:

      SELECT DISTINCT SWITCH FROM another_table_with_all_switches
      

      如果你想要的是不在MYTABLE 中的switch 的值,而不是空值的整个表,你可以试试:

      SELECT * FROM
      (SELECT 1 AS s UNION SELECT 2 AS s UNION SELECT 3) AS st
      WHERE st.s NOT IN (SELECT DISTINCT SWITCH FROM MYTABLE)
      

      【讨论】:

      • 这会返回表中的所有结果 :(
      • 据我了解,您希望所有寄存器为 1,2 或 3,并为所有其他寄存器设置默认值,对吗?如果没有,您能详细说明一下吗?就像给出一个示例输入和输出所需的
      • @Sudha 我想我现在得到了你的问题,看看编辑是否有帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2017-01-15
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      相关资源
      最近更新 更多