在没有结果的情况下使用不同的WHERE

时间:2015-08-27 13:51:06

标签: sql sql-server

我正在尝试使这个SQL语句更简单,并且正在寻找一种方法来改变WHERE子句,如果没有结果,所以我不必重复其他部分。

我已经尝试使用OR,但这不是我需要的。

首先搜索与ID字段完全匹配的记录。如果没有结果,则会查找ID LIKE。如果仍然没有结果,它将检查Nombre列的相同输入。

IF EXISTS (SELECT ID FROM StockDetalles WHERE ID = '112')
BEGIN
SELECT        StockDetalles.ID, Negocios.NombreNegocio AS [Nombre Local], StockDetalles.Nombre, Stock.[Precio de Venta], Stock.Cantidad, 
                         Stock.[Fecha Actualizacion de Precio], Stock.[Fecha Actualizacion de Cantidad], StockDetalles.Proveedor, StockDetalles.[Precio de Compra], 
                         Stock.[Cantidad Reposicion], StockDetalles.CategoriaID, StockFotos.Foto
FROM            Stock INNER JOIN
                         StockDetalles ON Stock.ID = StockDetalles.ID INNER JOIN
                         Negocios ON Stock.IDNegocio = Negocios.IDNegocio INNER JOIN
                         StockFotos ON StockDetalles.ID = StockFotos.IDProducto
WHERE        (StockDetalles.ID = '112')
AND Stock.IDNegocio = 1
END
ELSE IF EXISTS(SELECT ID FROM StockDetalles WHERE ID LIKE '%112%')
BEGIN
SELECT        StockDetalles.ID, Negocios.NombreNegocio AS [Nombre Local], StockDetalles.Nombre, Stock.[Precio de Venta], Stock.Cantidad, 
                         Stock.[Fecha Actualizacion de Precio], Stock.[Fecha Actualizacion de Cantidad], StockDetalles.Proveedor, StockDetalles.[Precio de Compra], 
                         Stock.[Cantidad Reposicion], StockDetalles.CategoriaID, StockFotos.Foto
FROM            Stock INNER JOIN
                         StockDetalles ON Stock.ID = StockDetalles.ID INNER JOIN
                         Negocios ON Stock.IDNegocio = Negocios.IDNegocio INNER JOIN
                         StockFotos ON StockDetalles.ID = StockFotos.IDProducto
WHERE        (StockDetalles.ID LIKE '%112%')
AND Stock.IDNegocio = 1
END
ELSE IF EXISTS(SELECT ID FROM StockDetalles WHERE Nombre LIKE '%112%')
BEGIN
SELECT        StockDetalles.ID, Negocios.NombreNegocio AS [Nombre Local], StockDetalles.Nombre, Stock.[Precio de Venta], Stock.Cantidad, 
                         Stock.[Fecha Actualizacion de Precio], Stock.[Fecha Actualizacion de Cantidad], StockDetalles.Proveedor, StockDetalles.[Precio de Compra], 
                         Stock.[Cantidad Reposicion], StockDetalles.CategoriaID, StockFotos.Foto
FROM            Stock INNER JOIN
                         StockDetalles ON Stock.ID = StockDetalles.ID INNER JOIN
                         Negocios ON Stock.IDNegocio = Negocios.IDNegocio INNER JOIN
                         StockFotos ON StockDetalles.ID = StockFotos.IDProducto
WHERE        (StockDetalles.Nombre LIKE '%112%' )
AND Stock.IDNegocio = 1
END

5 个答案:

答案 0 :(得分:1)

窗口函数的另一种方法:

;with cte1 as(select StockDetalles.ID,
                     Negocios.NombreNegocio AS [Nombre Local], 
                     StockDetalles.Nombre, 
                     Stock.[Precio de Venta], 
                     Stock.Cantidad, 
                     Stock.[Fecha Actualizacion de Precio],
                     Stock.[Fecha Actualizacion de Cantidad], 
                     StockDetalles.Proveedor, 
                     StockDetalles.[Precio de Compra], 
                     Stock.[Cantidad Reposicion],     
                     StockDetalles.CategoriaID, 
                     StockFotos.Foto,
                     row_number() over(order by case when id = '112' then 1
                                                     when id like '%112%' then 2
                                                     when nombre like '%112%' then 3 
                                                     else 4 end) rn1
              from Stock 
              join StockDetalles on Stock.ID = StockDetalles.ID 
              join Negocios on Stock.IDNegocio = Negocios.IDNegocio 
              join StockFotos on StockDetalles.ID = StockFotos.IDProducto
              where Stock.IDNegocio = 1),
cte2 as(select *, row_number() over(order by rn1) rn2 from cte1)
select * from cte2
where rn2 = 1 and rn1 <> 4

答案 1 :(得分:0)

您可以使用公用表表达式使其更简单一点:

with stock_cte as
(SELECT  StockDetalles.ID ID, Negocios.NombreNegocio AS [Nombre Local], StockDetalles.Nombre Nombre,
Stock.[Precio de Venta] [Precio de Venta], Stock.Cantidad Cantidad, Stock.[Fecha Actualizacion de Precio] [Fecha Actualizacion de Precio],
Stock.[Fecha Actualizacion de Cantidad] [Fecha Actualizacion de Cantidad], StockDetalles.Proveedor Proveedor, StockDetalles.[Precio de Compra] [Precio de Compra],
Stock.[Cantidad Reposicion] [Cantidad Reposicion], StockDetalles.CategoriaID CategoriaID, StockFotos.Foto Foto

 FROM Stock 
 INNER JOIN StockDetalles ON Stock.ID = StockDetalles.ID 
 INNER JOIN Negocios ON Stock.IDNegocio = Negocios.IDNegocio 
 INNER JOIN StockFotos ON StockDetalles.ID = StockFotos.IDProducto

WHERE Stock.IDNegocio = 1)

Select *
from stock_cte sc
where exists (select 1 from StockDetalles where sc.ID = '112') OR
      (not exists (select 1 from StockDetalles where sc.ID = '112') and
       exists(SELECT 1 FROM StockDetalles WHERE sc.ID LIKE '%112%')) OR
      (not exists (select 1 from StockDetalles where sc.ID = '112') and 
       not exists(SELECT 1 FROM StockDetalles WHERE sc.ID LIKE '%112%') and 
       sc.Nombre LIKE '%112%')

答案 2 :(得分:0)

正如我上面所说,尝试逐个添加订单

select TOP 1 * 
From
(
SELECT '123' as a, '122345' as b UNION
Select '#123#', '' union
select 'abc', '122'
)t 

order by CASE WHEN a like '123' THEN 1 ELSE CASE WHEN a LIKE '%123%' THEN 2 ELSE CASE WHEN b like '%122%' THEN 3 ELSE 4 END END END

答案 3 :(得分:0)

它应该是这样的,但我知道如何使它工作

SELECT  StockDetalles.ID ID, Negocios.NombreNegocio AS [Nombre Local], StockDetalles.Nombre Nombre,
Stock.[Precio de Venta] [Precio de Venta], Stock.Cantidad Cantidad, Stock.[Fecha Actualizacion de Precio] [Fecha Actualizacion de Precio],
Stock.[Fecha Actualizacion de Cantidad] [Fecha Actualizacion de Cantidad], StockDetalles.Proveedor Proveedor, StockDetalles.[Precio de Compra] [Precio de Compra],
Stock.[Cantidad Reposicion] [Cantidad Reposicion], StockDetalles.CategoriaID CategoriaID, StockFotos.Foto Foto

 FROM Stock 
 INNER JOIN StockDetalles ON Stock.ID = StockDetalles.ID 
 INNER JOIN Negocios ON Stock.IDNegocio = Negocios.IDNegocio 
 INNER JOIN StockFotos ON StockDetalles.ID = StockFotos.IDProducto

WHERE Stock.IDNegocio = 1 AND 
(
CASE 
    WHEN EXISTS (SELECT StockDetalles.ID FROM StockDetalles WHERE StockDetalles.ID = '112')
    THEN StockDetalles.ID = '112'
    WHEN EXISTS(SELECT StockDetalles.ID FROM StockDetalles WHERE StockDetalles.ID LIKE '%112%')
    THEN StockDetalles.ID LIKE '%112%'
    WHEN EXISTS(SELECT StockDetalles.ID FROM StockDetalles WHERE StockDetalles.Nombre LIKE '%112%')
    THEN StockDetalles.Nombre LIKE '%112%'
END
)

答案 4 :(得分:0)

OR会起作用,你只需要正确的条件:

SELECT        StockDetalles.ID, Negocios.NombreNegocio AS [Nombre Local], StockDetalles.Nombre, Stock.[Precio de Venta], Stock.Cantidad, 
                         Stock.[Fecha Actualizacion de Precio], Stock.[Fecha Actualizacion de Cantidad], StockDetalles.Proveedor, StockDetalles.[Precio de Compra], 
                         Stock.[Cantidad Reposicion], StockDetalles.CategoriaID, StockFotos.Foto
FROM            Stock INNER JOIN
                         StockDetalles ON Stock.ID = StockDetalles.ID INNER JOIN
                         Negocios ON Stock.IDNegocio = Negocios.IDNegocio INNER JOIN
                         StockFotos ON StockDetalles.ID = StockFotos.IDProducto
WHERE 
    StockDetalles.ID = '112' OR -- the ID equals 112
    (StockDetalles.ID LIKE '%112%' AND NOT EXISTS (SELECT 1 FROM StockDetalles WHERE ID = '112')) OR -- the ID is like 112, and no ID exists that equals 112
    (StockDetalles.Nombre  LIKE '%112%' AND NOT EXISTS (SELECT 1 FROM StockDetalles WHERE ID LIKE '%112%')) -- the Nombre is like 112, and no ID exists that is like 112 (which would include any ID that exactly matched 112)