簡體   English   中英

將整數數組傳遞給sqlite的“ IN”子句的最佳方法

[英]Best way to pass array of integers to sqlite for an 'IN' clause

我正在實現一個圖像dao,它根據client_type(例如dropbox,facebook等)選擇圖像,如下所示:

從任何與提供的客戶端類型列表匹配的已啟用客戶端返回結果:

//clientTypes is an array of NSNumber objects - there's an enum for each client type
- (NSArray*)listByClientTypes:(NSArray*)clientTypes
{
    __block NSArray* results;

    [[self.manager queue] inDatabase:^(FMDatabase* database)
    {
        NSMutableArray* mappedResults = [[NSMutableArray alloc] init];
        NSString* sql = @"SELECT IMAGE_ADDRESS, CLIENT_TYPE, CREATED, FK_LOCATIONS_UNIQUE_COORD, PLACE_NAME, CITY, COUNTRY, IMAGE "
            "FROM IMAGES LEFT JOIN LOCATIONS ON IMAGES.FK_LOCATIONS_UNIQUE_COORD = LOCATIONS.UNIQUE_COORD "
            "WHERE CLIENT_TYPE IN (SELECT CLIENT_TYPE FROM CLIENT_STATE WHERE ENABLED = 1) "
            "AND CLIENT_TYPE IN (%@)"; // <------- THIS IS THE LIST OF CLIENTS
        FMResultSet* resultSet = [database executeQuery:sql];
        while ([resultSet next])
        {
            [mappedResults addObject:[self extractImageFrom:resultSet]];
        }
        results = [mappedResults copy];
    }];
    return results;
}

傳遞“ IN”子句的最佳方法是什么?

通常我會使用參數綁定(例如'?'),但是我不知道如何為未知數量的參數執行此操作。 這可能嗎?

如果需要更好的方法,我打算只將逗號分隔的列表替換為SQL查詢。 鑒於它們只是整數,因此這將是非常安全的。

如果您使用的是非整數數據類型,則使用SQL綁定非常重要,如@MartinR 在此處的答案所述。 這是為了:

  • 避免使用引號引起的問題(如果引號未正確轉義)。
  • 避免SQL注入漏洞。

給定的是,在您的情況下,您有一個整數列表,可以嘗試如下操作:

NSString *sql =
[NSString stringWithFormat:@"SELECT IMAGE_ADDRESS, CLIENT_TYPE, CREATED, FK_LOCATIONS_UNIQUE_COORD, PLACE_NAME, CITY, COUNTRY, IMAGE "
            "FROM IMAGES LEFT JOIN LOCATIONS ON IMAGES.FK_LOCATIONS_UNIQUE_COORD = LOCATIONS.UNIQUE_COORD "
            "WHERE CLIENT_TYPE IN (SELECT CLIENT_TYPE FROM CLIENT_STATE WHERE ENABLED = 1) "
            "AND CLIENT_TYPE IN (%@)",[clientTypes componentsJoinedByString:@"','"]];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM