我正在尝试使这个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
答案 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)