在语句中选择子查询然后是什么情况?或者怎么办?

时间:2015-01-27 14:35:13

标签: sql database scalar-subquery

它只是一个例子。 (我的观点是,当我在CASE声明中获得多于一个结果时,我该怎么办):

SELECT 
,@PARAM AS id 
,Date=( 
SELECT distinct CASE
    WHEN P.DATE1 <= 05 and P.DATE2 <= 10
    THEN 'X'
    WHEN P.DATE1 > 05 and P.DATE2 <= 10
    THEN 'Y
    WHEN P.DATE2 > 10
    THEN 'Z' 
 END )
 FROM Prod AS P

错误如下:

  

子查询返回的值超过1。子查询遵循=,!=,&lt;,&lt; =,&gt;,&gt; =或子查询用作表达式时不允许这样做**

3 个答案:

答案 0 :(得分:1)

您的子查询返回了几行。您需要将其修改为返回单行,使用单个列,通过过滤或向其添加TOP 1。例如:

,Date=( 
SELECT distinct CASE
  WHEN P.DATE1 <= 05 and P.DATE2 <= 10
  THEN 'X'
  WHEN P.DATE1 > 05 and P.DATE2 <= 10
  THEN 'Y
  WHEN P.DATE2 > 10
  THEN 'Z' 
END 
WHERE -- >> your filter here <<
)

,Date=( 
SELECT TOP 1 distinct CASE
  WHEN P.DATE1 <= 05 and P.DATE2 <= 10
  THEN 'X'
  WHEN P.DATE1 > 05 and P.DATE2 <= 10
  THEN 'Y
  WHEN P.DATE2 > 10
  THEN 'Z' 
END )

仅在每行中定义要重新记录的值时的情况,而不是用单个值替换多个行。

答案 1 :(得分:1)

你可能不想要一个子选择/子查询,你可能只想要一个案例:

SELECT 
,@PARAM AS id 
,(CASE
    WHEN P.DATE1 <= 05 and P.DATE2 <= 10
    THEN 'X'
    WHEN P.DATE1 > 05 and P.DATE2 <= 10
    THEN 'Y
    WHEN P.DATE2 > 10
    THEN 'Z' 
 END) AS Date
 FROM Prod AS P

您的错误是因为Date = (SELECT ...)执行查询(每行P)并且必须只有一列,并且返回的行设置为Date。

答案 2 :(得分:0)

如果日期为10,因为它符合您的所有三个条件,目前无法正常工作,您需要删除=<上的>。< / p>

SELECT DISTINCT CASE 
                WHEN Date < 10 
                THEN 'X'
                WHEN Date = 10 
                THEN 'Y'
                WHEN Date > 10 
                THEN 'Z'
                END