来自 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)。