Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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
我的存储过程有问题吗?我想在if语句的基础上取消或添加一个“AND”,但美国mysql不允许?_Mysql_Sql_Stored Procedures - Fatal编程技术网

我的存储过程有问题吗?我想在if语句的基础上取消或添加一个“AND”,但美国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

当我运行这段代码时,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 

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表示友好。非常感谢你的帮助。这就是我想要的。