Как вставить mutliple where предложения в строку SQL - PullRequest
1 голос
/ 11 июня 2019

Я использую базу данных Azure Cosmos NoSQL с синтаксисом SQL.Как создать строку SQL, которая может динамически добавлять больше операторов WHERE?Например, я хочу иметь возможность не кодировать в "ГДЕ f.%s=@val" для одной, а затем жестко закодировать другую функцию с помощью "ГДЕ f.%s=@val1 AND f.%s=@val2"если у меня есть два, где заявления.Я хочу иметь до 7 операторов WHERE.

Ниже у меня есть код, который запрашивает одно свойство (один оператор WHERE) и другой, который запрашивает 2 свойства (два оператора WHERE).Здесь много сложного кодирования.Строки с queryString - вот где у меня проблемы.

public Iterable<Document> queryForOneProperty(String databaseName, String 
    collectionName, String key, String val) {

    FeedOptions queryOptions = getDefaultFeedOptions();
    String collectionLink = String.format("/dbs/%s/colls/%s", databaseName, collectionName);

    SqlParameterCollection paramCollection = new SqlParameterCollection();
    paramCollection.add(new SqlParameter("@val", val));
    SqlQuerySpec query = new SqlQuerySpec(String.format("SELECT * FROM %s f WHERE f.%s = @val", collectionName, key), paramCollection);

    return query;
}

public Iterable<Document> queryForTwoProperties(String databaseName, String 
    collectionName, String[] keys, String[] vals) {

    FeedOptions queryOptions = getDefaultFeedOptions();
    String collectionLink = String.format("/dbs/%s/colls/%s", databaseName, collectionName);

    SqlParameterCollection paramCollection = new SqlParameterCollection();
    paramCollection.add(new SqlParameter("@val1", vals[0]));
    paramCollection.add(new SqlParameter("@val2", vals[1]));
    String queryString = String.format("SELECT * FROM %s f WHERE f.%s = @val1 AND f.%s = @val2", collectionName, keys[0], keys[1]);
    SqlQuerySpec query = new SqlQuerySpec(queryString, paramCollection);

    return query;
}

'' '

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Попробуйте использовать это значение null

SELECT * FROM %s f WHERE (@val1 is null or f.%s = @val1) AND (@val2 is null or f.%s = @val2) 
0 голосов
/ 11 июня 2019

Вы можете создать фиктивное первое условие, а затем только добавить AND ...

String condition = "WHERE 1 = 1";

if (some logic) {
    condition += " AND x = 42";
}

Вот простой пример метода фабрики запросов

private final static String BASE_QUERY = "SELECT * FROM %s f WHERE 1 = 1";

public static String queryBuilder(String ... conditions) {
    StringBuilder builder = new StringBuilder(BASE_QUERY);
    for (String condition : conditions) {
        builder.append(" ");
        builder.append(condition);      
     }
     return builder.toString();
}

Пример

System.out.println(queryBuilder("AND f.%s = @val1", "AND f.%s = @val2"));
System.out.println(queryBuilder("AND f.%s = @val1"));
System.out.println(queryBuilder());

т

ВЫБРАТЬ * ИЗ% s f ГДЕ 1 = 1 И f.% S = @ val1 И f.% S = @ val2
ВЫБРАТЬ * ОТ% s f ГДЕ 1 = 1 И f.% S = @ val1
ВЫБРАТЬ * ОТ% s f ГДЕ 1 = 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...