我的存储过程有问题吗?我想在if语句的基础上取消或添加一个“AND”,但美国mysql不允许?
当我运行这段代码时,mysql向我显示了一个语法错误,这是不允许的我的存储过程有问题吗?我想在if语句的基础上取消或添加一个“AND”,但美国mysql不允许?,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,当我运行这段代码时,mysql向我显示了一个语法错误,这是不允许的 DELIMITER // CREATE PROCEDURE `GetHotelByLocationArrivalDeparture`(IN strLocation VARCHAR(500),IN dateArrival DATE,IN dateDeparture DATE,IN strOrderBy VARCHAR(500),IN nMinPrice FLOAT,IN nMaxPrice FLOAT) BEGIN S
DELIMITER //
CREATE PROCEDURE `GetHotelByLocationArrivalDeparture`(IN strLocation VARCHAR(500),IN dateArrival DATE,IN dateDeparture DATE,IN strOrderBy VARCHAR(500),IN nMinPrice FLOAT,IN nMaxPrice FLOAT)
BEGIN
SELECT
HT.HotelId AS HotelId,
HT.HotelName AS HotelName,
HT.HotelDescription AS HotelDescription,
HT.HotelLogo AS HotelLogo,
HT.HotelStar AS HotelStar,
HT.HotelLocation AS HotelLocation,
HT.HotelLatitude AS HotelLatitude,
HT.HotelLongitude AS HotelLongitude,
HT.AccomodationTypeId AS AccomodationTypeId,
RM.RoomId AS RoomId,
RM.RoomName AS RoomName,
RM.RoomMaxPeople AS RoomMaxPeople,
RM.RoomCurrency AS RoomCurrency,
RM.RoomMinDays AS RoomMinDays,
RM.RoomKeyInfo AS RoomKeyInfo,
RM.RoomBedTypeOneId AS RoomBedTypeOneId,
RM.RoomBedTypeTwoId AS RoomBedTypeTwoId,
DR.DateRangeId AS DateRangeId,
DR.DateRangeFromDate AS DateRangeFromDate,
DR.DateRangeToDate AS DateRangeToDate,
DR.DateRangeNote AS DateRangeNote,
DR.CurrencyId AS DateRangeCurrencyId,
DR.DateRangeMinNight AS DateRangeMinNight,
DR.RoomId AS DateRangeRoomId,
DRR.DateRowId AS DateRowId,
DRR.DateRowNetRate AS DateRowNetRate,
DRR.DateRowDiscount AS DateRowDiscount,
DRR.DateRowDiscountedNet AS DateRowDiscountedNet,
DRR.DateRowTax AS DateRowTax,
DRR.DateRowHotelPrice AS DateRowHotelPrice,
DRR.DateRowMarkup AS DateRowMarkup,
DRR.DateRowClientPrice AS DateRowClientPrice,
DRR.DateRowConvertedPrice AS DateRowConvertedPrice,
DRR.DateRowType AS DateRowType
FROM
tblhotel HT,
tblroom RM,
tbldaterange DR,
tbldaterow DRR
WHERE
(
LOWER(HT.HotelName) REGEXP TRIM(BOTH '"' FROM strLocation)
OR LOWER(HT.HotelLocation) REGEXP TRIM(BOTH '"' FROM strLocation)
)
AND
(
(
DR.DateRangeToDate > TRIM(BOTH '"' FROM dateArrival)
AND TRIM(BOTH '"' FROM dateDeparture) > DR.DateRangeFromDate
AND TRIM(BOTH '"' FROM dateArrival) >= DR.DateRangeFromDate
AND TRIM(BOTH '"' FROM dateDeparture) <= DR.DateRangeToDate
)
OR
(
(
TRIM(BOTH '"' FROM dateDeparture) BETWEEN DR.DateRangeFromDate AND DR.DateRangeToDate
)
AND TRIM(BOTH '"' FROM dateDeparture) > DR.DateRangeFromDate
AND TRIM(BOTH '"' FROM dateArrival) >= DR.DateRangeFromDate
AND TRIM(BOTH '"' FROM dateDeparture) <= DR.DateRangeToDate
)
)
AND (HT.HotelId = RM.HotelId)
AND (RM.RoomId = DR.RoomId)
AND (DR.DateRangeId = DRR.DateRangeId)
AND
( HT.IsActive = 1
AND HT.IsDeleted <> 1
AND RM.IsActive = 1
AND RM.IsDeleted <> 1
AND DR.IsActive = 1
AND DR.IsDeleted <> 1
)
/* This is what i want to do */
IF (nMinPrice > AND nMaxPrice > 0) THEN
AND DRR.DateRowClientPrice BETWEEN nMinPrice AND nMaxPrice
END IF;
/* This is what i want to do */
ORDER BY
CASE WHEN strOrderBy='sorthotelname_DESC' THEN HT.HotelName END DESC,
CASE WHEN strOrderBy='sorthotelname_ASC' THEN HT.HotelName END ASC,
CASE WHEN strOrderBy='sorthotelstars_DESC' THEN HT.HotelStar END DESC,
CASE WHEN strOrderBy='sorthotelstars_ASC' THEN HT.HotelStar END ASC,
CASE WHEN strOrderBy='sorthotelprice_DESC' THEN CONCAT(DRR.DateRowClientPrice ,'') END DESC,
CASE WHEN strOrderBy='sorthotelprice_ASC' THEN CONCAT(DRR.DateRowClientPrice ,'') END ASC,
CASE WHEN strOrderBy='sorthotellocation_DESC' THEN HT.HotelLocation END DESC,
CASE WHEN strOrderBy='sorthotellocation_ASC' THEN HT.HotelLocation END ASC;
END //
DELIMITER ;
我不认为你可以在WHERE子句的中间插入IF。相反,重新设计逻辑,使IF成为布尔表达式,可能类似于:
and case
when nMinPrice > 0 and nMaxPrice > 0 then
DRR.DateRowClientPrice BETWEEN nMinPrice AND nMaxPrice
else
1
end
如果nMinPrice和NMXPrice为正值,则该案例的值为:
DRR.DateRowClientPrice BETWEEN nMinPrice AND nMaxPrice
如果nMinPrice或nMaxPrice中的一个为非正,则该情况将为1,即true,且与true的逻辑连接为no op,因此该情况将被有效忽略 欢迎来到Stackoverflow。我很想帮助你,但是我们mysql显示错误不是问题,我不知道你在问什么。在没有对问题或实际问题进行清楚描述的情况下,费力地处理这些杂乱无章的未格式化代码,试图找出可能的错误是有点困难的。请将您的问题包含在您收到的实际错误消息中。当你这样做的时候,你可以点击小按钮?按钮,获取有关格式化文章中代码的信息,使其可读,并使其便于我们阅读:-欢迎来到StackOverflow!请学习如何在问题中设置代码格式,以及如何清楚地说明代码的错误之处以及您希望得到的帮助。这是一个合适的地方,可以发表评论,如“需要更多Eeek!”!?这个问题似乎离题了,因为它是关于读心术的。我刚刚格式化了代码,你能马上检查一下吗。Thanks@peterm:谢谢。谢谢你在评论中对nube表示友好。非常感谢你的帮助。这就是我想要的。