我在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运行它以知道选择了多少列时,它只显示1,这是满足条件的第一列(在这种情况下是anatomia ='si') 。我知道这是第一个因为如果我删除SELECT ...其中anatomia ='si',那么Log.d打印nutricion ='si',这是下一个条件是真的。 我希望这段代码选择我设置的条件满足的所有列,而不仅仅是满足它的第一列。 先感谢您。 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
}
答案 0 :(得分:1)
这是UNION
的作用:它执行一堆查询,并将每个查询的结果合并到一个结果集中。使用UNION
而不使用ALL
修饰符时,会删除重复的行。这就是为什么您只获得一行 - 所有匹配的行只包含'si'
,因此它们都是重复的。
附注:为了防止SQL注入攻击,您应始终使用?
占位符的查询,在{{selectionArgs
的情况下,在单独的值数组中提供参数(第二个参数rawQuery()
1}})。
我不确定,但似乎你想知道是否有一个&#39; si&#39;在每一栏中。这里有一个替代方案,为每个人提供一个真/假:
SELECT
anatomia='si' AS anatomia,
bioquimica='si' AS bioquimica,
histologia='si' AS histologia,
...
FROM yourtable
WHERE usuario=?
这会给你一个类似于:
的结果anatomia bioquimica histologia ...
1 0 1 ...
但是,也许你应该考虑改变你的表格设计来制作列BOOLEAN
- 因为&#39; si&#39;真的听起来像一个布尔值。这样,您基本上可以SELECT * FROM...
或至少SELECT anatomia, bioquimica, histologia... FROM...
,从而使您的代码更漂亮。 :)
@LuisE回复评论后更新:
将列视为&#34;数据&#34;并不是一种非常方便的方法。在SQL中。我能想到的最好的选择是(假设我们已经从&#39; si&#39;变为实际的布尔值):
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
)。