来自 BuildUnionQuery 的 SQLite rawQuery 只选择第一个真实条件
SQLite rawQuery from BuildUnionQuery Selecting just the first true condition
我在 Android Studio
中有以下代码
String[] buildquery={
"SELECT anatomia FROM "+usuariosinfodbh.tablausuarioname+" WHERE anatomia='si' AND usuario='"+nombre+"';",
"SELECT bioquimica FROM "+usuariosinfodbh.tablausuarioname+" WHERE bioquimica='si' AND usuario='"+nombre+"';",
"SELECT histologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE histologia='si' AND usuario='"+nombre+"';",
"SELECT fisiologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE fisiologia='si' AND usuario='"+nombre+"';",
"SELECT embriologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE embriologia='si' AND usuario='"+nombre+"';",
"SELECT microbiologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE microbiologia='si' AND usuario='"+nombre+"';",
"SELECT urgencias FROM "+usuariosinfodbh.tablausuarioname+" WHERE urgencias='si' AND usuario='"+nombre+"';",
"SELECT farmacologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE farmacologia='si';",
"SELECT nutricion FROM "+usuariosinfodbh.tablausuarioname+" WHERE nutricion='si' AND usuario='"+nombre+"';",
"SELECT patologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE patologia='si' AND usuario='"+nombre+"';",
"SELECT fisiopatologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE fisiopatologia='si' AND usuario='"+nombre+"';"
};
SQLiteQueryBuilder qb=new SQLiteQueryBuilder();
String query=qb.buildUnionQuery(buildquery, null, null);
Cursor c= db.rawQuery(query, null);
当我 运行 使用相关的 Log.d 来了解有多少列被 select 编辑时,它只显示 1,这是条件为的第一列遇到(在这种情况下是 anatomia='si')。我知道这是第一个,因为如果我删除 SELECT... where anatomia='si',那么 Log.d 打印 nutricion='si',这是下一个条件为真。
我希望此代码 select 满足我设置的条件的所有列,而不仅仅是满足它的第一列。
先感谢您。
PS:(Log.d)我使用的是:
Log.d("countcolumsreg", Integer.toString(c.getCount()));//0
Log.d("countcolumns", Integer.toString(c.getColumnCount()));//0
和
String[] usuariomaterias= new String[c.getColumnCount()];
for (int i=0; i<c.getColumnCount();i++) {
usuariomaterias[i] = c.getColumnName(i);
Log.d("arrayseg",usuariomaterias[i]); //anatomia
}
这就是 UNION
的作用:它执行一系列查询,并将每个查询的结果合并到一个结果集中。在不带 ALL
修饰符的情况下使用 UNION
时,将删除重复的行。这就是为什么您只得到一行的原因 - 所有匹配的行都只包含 'si'
,所以它们都是重复的。
旁注:为了防止 SQL 注入攻击,您应该始终使用带有 ?
占位符的查询,在单独的值数组中提供参数(第二个参数,selectionArgs
,在 rawQuery()
).
的情况下
我不确定,但您似乎想知道每列中是否有 'si'。这是一个替代方案,它为您提供 TRUE/FALSE 每个:
SELECT
anatomia='si' AS anatomia,
bioquimica='si' AS bioquimica,
histologia='si' AS histologia,
...
FROM yourtable
WHERE usuario=?
这会给你一个看起来像这样的结果:
anatomia bioquimica histologia ...
1 0 1 ...
但是,也许您应该考虑更改 table 设计,改为使用 BOOLEAN
列——因为 'si' 听起来确实像一个布尔值。这样,您基本上可以执行 SELECT * FROM...
或至少 SELECT anatomia, bioquimica, histologia... FROM...
,从而使您的代码更漂亮。 :)
@LuisE 回复评论后更新:
在 SQL 中,将列视为 "data" 并没有真正方便的方法。我能想到的最佳选择是(假设我们已经将 'si' 更改为实际布尔值):
SELECT 'anatomia' FROM yourtable WHERE usuario=?1 AND anatomia
UNION SELECT 'bioquimica' FROM yourtable WHERE usuario=?1 AND bioquimica
UNION SELECT 'histologia' FROM yourtable WHERE usuario=?1 AND histologia
...
但是如您所见,这仍然需要一堆非常相似的 SELECT。不是很漂亮
顺便说一句,通过所有这些,我假设 usuario 是独一无二的(作为 PRIMARY KEY
或只是 UNIQUE
)。
我在 Android Studio
中有以下代码String[] buildquery={
"SELECT anatomia FROM "+usuariosinfodbh.tablausuarioname+" WHERE anatomia='si' AND usuario='"+nombre+"';",
"SELECT bioquimica FROM "+usuariosinfodbh.tablausuarioname+" WHERE bioquimica='si' AND usuario='"+nombre+"';",
"SELECT histologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE histologia='si' AND usuario='"+nombre+"';",
"SELECT fisiologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE fisiologia='si' AND usuario='"+nombre+"';",
"SELECT embriologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE embriologia='si' AND usuario='"+nombre+"';",
"SELECT microbiologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE microbiologia='si' AND usuario='"+nombre+"';",
"SELECT urgencias FROM "+usuariosinfodbh.tablausuarioname+" WHERE urgencias='si' AND usuario='"+nombre+"';",
"SELECT farmacologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE farmacologia='si';",
"SELECT nutricion FROM "+usuariosinfodbh.tablausuarioname+" WHERE nutricion='si' AND usuario='"+nombre+"';",
"SELECT patologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE patologia='si' AND usuario='"+nombre+"';",
"SELECT fisiopatologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE fisiopatologia='si' AND usuario='"+nombre+"';"
};
SQLiteQueryBuilder qb=new SQLiteQueryBuilder();
String query=qb.buildUnionQuery(buildquery, null, null);
Cursor c= db.rawQuery(query, null);
当我 运行 使用相关的 Log.d 来了解有多少列被 select 编辑时,它只显示 1,这是条件为的第一列遇到(在这种情况下是 anatomia='si')。我知道这是第一个,因为如果我删除 SELECT... where anatomia='si',那么 Log.d 打印 nutricion='si',这是下一个条件为真。 我希望此代码 select 满足我设置的条件的所有列,而不仅仅是满足它的第一列。 先感谢您。 PS:(Log.d)我使用的是:
Log.d("countcolumsreg", Integer.toString(c.getCount()));//0
Log.d("countcolumns", Integer.toString(c.getColumnCount()));//0
和
String[] usuariomaterias= new String[c.getColumnCount()];
for (int i=0; i<c.getColumnCount();i++) {
usuariomaterias[i] = c.getColumnName(i);
Log.d("arrayseg",usuariomaterias[i]); //anatomia
}
这就是 UNION
的作用:它执行一系列查询,并将每个查询的结果合并到一个结果集中。在不带 ALL
修饰符的情况下使用 UNION
时,将删除重复的行。这就是为什么您只得到一行的原因 - 所有匹配的行都只包含 'si'
,所以它们都是重复的。
旁注:为了防止 SQL 注入攻击,您应该始终使用带有 ?
占位符的查询,在单独的值数组中提供参数(第二个参数,selectionArgs
,在 rawQuery()
).
我不确定,但您似乎想知道每列中是否有 'si'。这是一个替代方案,它为您提供 TRUE/FALSE 每个:
SELECT
anatomia='si' AS anatomia,
bioquimica='si' AS bioquimica,
histologia='si' AS histologia,
...
FROM yourtable
WHERE usuario=?
这会给你一个看起来像这样的结果:
anatomia bioquimica histologia ...
1 0 1 ...
但是,也许您应该考虑更改 table 设计,改为使用 BOOLEAN
列——因为 'si' 听起来确实像一个布尔值。这样,您基本上可以执行 SELECT * FROM...
或至少 SELECT anatomia, bioquimica, histologia... FROM...
,从而使您的代码更漂亮。 :)
@LuisE 回复评论后更新:
在 SQL 中,将列视为 "data" 并没有真正方便的方法。我能想到的最佳选择是(假设我们已经将 'si' 更改为实际布尔值):
SELECT 'anatomia' FROM yourtable WHERE usuario=?1 AND anatomia
UNION SELECT 'bioquimica' FROM yourtable WHERE usuario=?1 AND bioquimica
UNION SELECT 'histologia' FROM yourtable WHERE usuario=?1 AND histologia
...
但是如您所见,这仍然需要一堆非常相似的 SELECT。不是很漂亮
顺便说一句,通过所有这些,我假设 usuario 是独一无二的(作为 PRIMARY KEY
或只是 UNIQUE
)。