Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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
Java 如何在SQL字符串中插入mutliple where子句_Java_Sql_Azure_Azure Cosmosdb - Fatal编程技术网

Java 如何在SQL字符串中插入mutliple where子句

Java 如何在SQL字符串中插入mutliple where子句,java,sql,azure,azure-cosmosdb,Java,Sql,Azure,Azure Cosmosdb,我正在使用一个带有SQL语法的Azure Cosmos NoSQL数据库。如何创建可以动态添加更多WHERE语句的SQL字符串?例如,如果我有两个WHERE语句,我希望不必为一个函数编写“WHERE f.%s=@val”,然后用“WHERE f.%s=@val1和f.%s=@val2”硬编码另一个函数。我想要7个WHERE语句 下面是查询一个属性(一个WHERE语句)和另一个查询两个属性(两个WHERE语句)的代码。涉及到很多硬编码。queryString的线路是我遇到麻烦的地方 public

我正在使用一个带有SQL语法的Azure Cosmos NoSQL数据库。如何创建可以动态添加更多WHERE语句的SQL字符串?例如,如果我有两个WHERE语句,我希望不必为一个函数编写“WHERE f.%s=@val”,然后用“WHERE f.%s=@val1和f.%s=@val2”硬编码另一个函数。我想要7个WHERE语句

下面是查询一个属性(一个WHERE语句)和另一个查询两个属性(两个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;
}
public Iterable queryForOneProperty(字符串数据库名,字符串
集合名称、字符串键、字符串值){
FeedOptions queryOptions=getDefaultFeedOptions();
String collectionLink=String.format(“/dbs/%s/colls/%s”,databaseName,collectionName);
SqlParameterCollection paramCollection=新的SqlParameterCollection();
添加(新的SqlParameter(“@val”,val));
SqlQuerySpec query=新的SqlQuerySpec(String.format(“从%s f中选择*,其中f.%s=@val”、collectionName、key)、paramCollection);
返回查询;
}
公共Iterable queryForTwoProperties(字符串数据库名称,字符串
collectionName、字符串[]键、字符串[]VAL){
FeedOptions queryOptions=getDefaultFeedOptions();
String collectionLink=String.format(“/dbs/%s/colls/%s”,databaseName,collectionName);
SqlParameterCollection paramCollection=新的SqlParameterCollection();
paramCollection.add(新的SqlParameter(@val1),vals[0]);
add(新的SqlParameter(@val2),vals[1]);
String queryString=String.format(“从%s中选择*,其中f.%s=@val1和f.%s=@val2”,集合名称,键[0],键[1]);
SqlQuerySpec query=新的SqlQuerySpec(queryString,paramCollection);
返回查询;
}

''

您可以创建一个虚假的第一个条件,然后只添加和

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


您可以创建一个虚假的第一个条件,然后只添加和

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

请尝试使用空值

SELECT * FROM %s f WHERE (@val1 is null or f.%s = @val1) AND (@val2 is null or f.%s = @val2) 
请尝试使用空值

SELECT * FROM %s f WHERE (@val1 is null or f.%s = @val1) AND (@val2 is null or f.%s = @val2) 

您没有正确读取它,它是@param1为null,或者它根据查询检查参数。您没有正确读取它,它是@param1为null,或者它根据查询检查参数。