Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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
o独立进行每次检查,并将结果合并在一起。@Yuck和我都有答案,可以帮你解决这个问题。+1有没有任何情况下它不会短路?@MarkBannister-是的,但它们有缺陷(在SQL Server中)。基本上,我所看到的唯一情况是,与变量的聚合进行比较(CASE_Sql_Sql Server - Fatal编程技术网

o独立进行每次检查,并将结果合并在一起。@Yuck和我都有答案,可以帮你解决这个问题。+1有没有任何情况下它不会短路?@MarkBannister-是的,但它们有缺陷(在SQL Server中)。基本上,我所看到的唯一情况是,与变量的聚合进行比较(CASE

o独立进行每次检查,并将结果合并在一起。@Yuck和我都有答案,可以帮你解决这个问题。+1有没有任何情况下它不会短路?@MarkBannister-是的,但它们有缺陷(在SQL Server中)。基本上,我所看到的唯一情况是,与变量的聚合进行比较(CASE,sql,sql-server,Sql,Sql Server,o独立进行每次检查,并将结果合并在一起。@Yuck和我都有答案,可以帮你解决这个问题。+1有没有任何情况下它不会短路?@MarkBannister-是的,但它们有缺陷(在SQL Server中)。基本上,我所看到的唯一情况是,与变量的聚合进行比较(CASE WHEN MAX(@var).)。它将对它们进行求值,但仍然返回正确的值。您可能需要将它们合并在一起,而不是进行连接(可能是使用coalesce语句进行外部连接)。假设任何给定的输入记录只有一个条件为真。即使如此,这也需要针对每个条件扫描源数


o独立进行每次检查,并将结果合并在一起。@Yuck和我都有答案,可以帮你解决这个问题。+1有没有任何情况下它不会短路?@MarkBannister-是的,但它们有缺陷(在SQL Server中)。基本上,我所看到的唯一情况是,与变量的聚合进行比较(
CASE WHEN MAX(@var).
)。它将对它们进行求值,但仍然返回正确的值。您可能需要将它们合并在一起,而不是进行连接(可能是使用coalesce语句进行外部连接)。假设任何给定的输入记录只有一个条件为真。即使如此,这也需要针对每个条件扫描源数据集一次,因此需要对数据进行100次扫描。@Dems:是的,这也可以。OP问题中的
ELSE
条件写为
ELSE
,因此列并不完全相同。我在回答中“修正”了这一点,但它可能不是一个拼写错误。好的方面,我不会假设拼写错误,它可能是相关的,因此对于其他结果,要求value2中的null。对于其他99个条件?(这给出了2个字段,但只针对1个条件)使用UNION,每个条件一个子查询。@Dems:您也可以在这里使用“或”(我编辑了我的示例以适应它),虽然代码对于有经验的人来说可能很容易理解,但初学者可能需要一个解释。请添加一个解释,说明您的代码是做什么的,以及它是如何解决问题的。
SELECT
  CASE
    WHEN <condition 1> THEN <value1=a1, value2=b1>
    WHEN <condition 2> THEN <value1=a2, value2=b2>
    ELSE <value1=a3, value3=b3>
  END
FROM <table>
WITH C1 AS (
  SELECT a1 AS value1, b1 AS value2
  FROM table
  WHERE condition1
), C2 AS (
  SELECT a2 AS value1, b2 AS value2
  FROM table
  WHERE condition2
), C3 AS (
  SELECT a3 AS value1, b3 AS value2
  FROM table
  WHERE condition3
)
SELECT value1, value2
FROM -- some table, joining C1, C2, C3 CTEs to get the cased values
;
SELECT * FROM
  (SELECT val1, val2 FROM table1 WHERE (condition1 is true) 
                                    OR (condition2 is true))
UNION
SELECT * FROM
  (SELECT val5, val6 FROM table7 WHERE (condition9 is true) 
                                    OR (condition4 is true))
SELECT
  CASE WHEN <condition 1> THEN <a1> WHEN <condition 2> THEN <a2> ELSE <a3> END,
  CASE WHEN <condition 1> THEN <b1> WHEN <condition 2> THEN <b2> ELSE <b3> END
FROM 
  <table> 
SELECT
  *
FROM
  <table>
CROSS APPLY
  (
   SELECT a1, b1 WHERE <condition 1>
   UNION ALL
   SELECT a2, b2 WHERE <condition 2>
   UNION ALL
   SELECT a3, b3 WHERE <condition 3>
  )
  AS case_proxy
WITH
  checked_data AS
(
  SELECT
    CASE WHEN <condition1> THEN 1
         WHEN <condition2> THEN 2
         WHEN <condition3> THEN 3
         ...
         ELSE                   100
    END AS condition_id,
    *
  FROM
    <table>
)
,
  results (condition_id, value1, value2) AS
(
   SELECT 1, a1, b1
   UNION ALL
   SELECT 2, a2, b2
   UNION ALL
   SELECT 3, a3, b3
   UNION ALL
   ...
   SELECT 100, a100, b100
)
SELECT
  *
FROM
  checked_data
INNER JOIN
  results
    ON results.condition_id = checked_data.condition_id
SELECT 
xmlcol.value('(value1)[1]', 'NVARCHAR(MAX)') AS value1,
xmlcol.value('(value2)[1]', 'NVARCHAR(MAX)') AS value2
FROM
(SELECT CASE
WHEN <condition 1> THEN
CAST((SELECT a1 AS value1, b1 AS value2 FOR XML PATH('')) AS XML)
WHEN <condition 2> THEN
CAST((SELECT a2 AS value1, b2 AS value2 FOR XML PATH('')) AS XML)
ELSE
CAST((SELECT a3 AS value1, b3 AS value2 FOR XML PATH('')) AS XML)
END AS xmlcol
FROM <table>) AS tmp
SELECT
  String_to_array(CASE
    WHEN <condition 1> THEN a1||','||b1
    WHEN <condition 2> THEN a2||','||b2
    ELSE a3||','||b3
  END, ',') K
FROM <table>
  SELECT
    a1,
    a2,
    a3,
    ...
  WHERE <condition 1>
    AND (<other conditions>)
  UNION
  SELECT
    b1,
    b2,
    b3,
    ...
  WHERE <condition 2>
    AND (<other conditions>)
  UNION
  SELECT
  ...
-- and so on