条件,如果sql

时间:2017-07-27 03:42:16

标签: sql sql-server

我有这个查询

SELECT 
    SI_Num_Inventario = COALESCE (t.SI_Num_Inventario, c.SI_Num_Inventario),
    SI_Ubicacion = COALESCE(t.SI_Ubicacion, c.SI_Ubicacion),
    SI_Ubicacion_Fisica = COALESCE(t.SI_Ubicacion_Fisica, c.SI_Ubicacion_Fisica),
    SI_Num_Articulo = COALESCE(t.SI_Articulo, c.SI_Num_Articulo),
    NULL,
    SI_Num_Conteo = COALESCE(cs.SI_Num_Conteo,2),
    GETDATE(),
    'Admin',
    c.SI_OV 
FROM 
    SI_Inventario_Teorico_QAD t
FULL JOIN 
    SI_Conteo c ON t.SI_Articulo = c.SI_Num_Articulo
                AND t.SI_Ubicacion = c.SI_Ubicacion 
INNER JOIN 
    SI_Maestro_Ref_QAD m ON t.SI_Articulo = m.SI_Num_Articulo
                         OR c.SI_Num_Articulo = m.SI_Num_Articulo
FULL JOIN 
    SI_Consecutivo cs ON c.SI_Num_Inventario = cs.SI_Num_Inventario
                      AND cs.SI_Estado = 0
WHERE 
    c.SI_Num_Articulo = 201423 OR t.SI_Articulo = 201423

我试图告诉你,如果c.SI_OV为NULL,请插入“INSERT INTO``

IF c.SI_OV IS NULL
    INSERT INTO SI_Conteo(SI_Num_Inventario, SI_Ubicacion,SI_Num_Articulo, SI_Cantidad,SI_Num_Conteo,SI_Fecha_Conteo, SI_Usuario,SI_OV)

如果它不是NULL,请插入另一个

ELSE
    INSERT INTO SI_Conteo(SI_Num_Inventario, SI_Ubicacion_Fisica, SI_Num_Articulo, SI_Cantidad,SI_Num_Conteo,SI_Fecha_Conteo, SI_Usuario,SI_OV)
END IF;

4 个答案:

答案 0 :(得分:0)

if else in non query language~ = CASE WHEN cond1 ELSE cond2 END in SQL

答案 1 :(得分:0)

使用以下查询:

INSERT INTO SI_Conteo(SI_Num_Inventario,SI_Ubicacion,SI_Ubicacion_Fisica,SI_Num_Articulo, SI_Cantidad,SI_Num_Conteo,SI_Fecha_Conteo,
SI_Usuario,SI_OV)
SELECT 
SI_Num_Inventario = COALESCE (t.SI_Num_Inventario,c.SI_Num_Inventario),
(CASE WHEN c.SI_OV IS NULL THEN  COALESCE(t.SI_Ubicacion, c.SI_Ubicacion) ELSE NULL END)AS SI_Ubicacion,
(CASE WHEN c.SI_OV IS NOT NULL THEN  COALESCE(t.SI_Ubicacion_Fisica, c.SI_Ubicacion_Fisica) ELSE NULL END)AS SI_Ubicacion_Fisica,
SI_Num_Articulo = COALESCE(t.SI_Articulo, c.SI_Num_Articulo),
NULL,
SI_Num_Conteo = COALESCE(cs.SI_Num_Conteo,2),
GETDATE(),
'Admin',
c.SI_OV 
FROM SI_Inventario_Teorico_QAD t
full JOIN SI_Conteo c
ON t.SI_Articulo = c.SI_Num_Articulo
AND t.SI_Ubicacion = c.SI_Ubicacion 
INNER JOIN SI_Maestro_Ref_QAD m 
ON  t.SI_Articulo = m.SI_Num_Articulo
OR c.SI_Num_Articulo = m.SI_Num_Articulo
FULL JOIN SI_Consecutivo cs
ON  c.SI_Num_Inventario = cs.SI_Num_Inventario
AND cs.SI_Estado = 0
WHERE c.SI_Num_Articulo = 201423 OR t.SI_Articulo = 201423 

基本上我已将两个插入组合到一个Insert中,其中包含两个列,您需要基于Case的开关。 SI_Ubicacion和SI_Ubicacion_Fisica中只有一列将根据s.SI_OV值设置。希望你能得到我所说的,。

注意:我无法执行此操作,因为我没有任何表结构/数据。我已手动修改您的查询并在此处发布。

答案 2 :(得分:0)

澄清你的问题。您有一个select语句,它返回一些行数的结果集。您建议将它们插入表中。您声称需要使用if / else(或类似),但不清楚原因。您提出的插入语句有一列不同 - 这是正确的吗?如果是这样,那么您可能需要使用2个不同的insert语句 - 一个用于处理非null情况,另一个用于处理null情况。您无法动态更改插入表的列列表。

OTOH,也许你只想交换插入SI_Conteo表的SI_Ubicacion列的值?如果是这样,你可以在select语句中使用isnull或coalesce(就像你现在做的那样 - 只是区别对待。)

答案 3 :(得分:0)

简而言之:CASE构造需要在您的SQL语句的SELECT子句中“活动”。接收INSERT子句应始终提及两个列名称,如此

INSERT INTO SI_CONTEO (SI_Num_Inventario, 
  SI_Ubicacion, SI_Ubicacion_fisico,
  SI_Num_Articulo, SI_Cantidad,SI_Num_Conteo,
  SI_Fecha_Conteo, SI_Usuario,SI_OV)
SELECT SI_Num_Inventario = COALESCE (t.SI_Num_Inventario,c.SI_Num_Inventario),
  SI_Ubicacion = CASE WHEN SI_OV IS NULL THEN COALESCE(t.SI_Ubicacion, c.SI_Ubicacion) END,
  SI_Ubicacion_Fisica = CASE WHEN NOT SU_OV IS NULL THEN COALESCE(t.SI_Ubicacion_Fisica, c.SI_Ubicacion_Fisica) END,
  SI_Num_Articulo = COALESCE(t.SI_Articulo, c.SI_Num_Articulo), 
  NULL, ...