Thanks Martin. What are the performance ramifications of using LIKE queries though? Wouldn't it essentially need to do a full table scan to look for this substring? And if I wanted to search for N tags at a time, it would be N full table scans?

On Thu, Nov 9, 2017 at 7:02 AM, martin van dinther <martin.van.dinther@monetdbsolutions.com> wrote:

Yes this is possible. You will need to use:  tags LIKE '%foo%' .  So include SQL % wildcards.

Note that LIKE matches case sensitive. To match case insensitive use ILIKE.


bash-4.4$ mclient
Welcome to mclient, the MonetDB/SQL interactive terminal (unreleased)
Database: MonetDB v11.27.10 (unreleased), 'demo'
Type \q to quit, \? for a list of available commands
auto commit mode: on

sql>CREATE TABLE my_table (tags json NOT NULL);
operation successful (11.805ms)

sql>INSERT INTO my_table VALUES ('["foo","bar","baz"]');
1 affected row (2.805ms)

sql>SELECT tags FROM my_table;
+---------------------+
| tags                |
+=====================+
| ["foo","bar","baz"] |
+---------------------+
1 tuple (1.944ms)

sql>SELECT tags FROM my_table WHERE tags LIKE '%foo%';
+---------------------+
| tags                |
+=====================+
| ["foo","bar","baz"] |
+---------------------+
1 tuple (2.271ms)

sql>SELECT count(*) FROM my_table WHERE tags LIKE '%foo%';
+------+
| L3   |
+======+
|    1 |
+------+
1 tuple (2.459ms)

sql>SELECT count(*) FROM my_table WHERE tags LIKE '%FOO%';
+------+
| L3   |
+======+
|    0 |
+------+
1 tuple (2.265ms)

sql>SELECT count(*) FROM my_table WHERE tags ILIKE '%FOO%';
+------+
| L3   |
+======+
|    1 |
+------+
1 tuple (2.437ms)

sql>\q


Regards,
Martin



On 06-11-17 17:19, Brian Ploetz wrote:
Hi,

Suppose I have a table with a "tags" column that is of the JSON datatype (https://www.monetdb.org/Documentation/Manuals/SQLreference/Types/JSON). The column will contain a JSON array of Strings. For example:

["foo","bar","baz"]

Is it possible to query for rows that contain a specific value in the tags array? For example, if I wanted to find all of the rows where tags contains "foo", my query would look something like:

select count(*) from my_table where tags ???? 'foo';


But it's not clear to me what ???? should be (or if it's even possible) based on the JSON documentation above.

Thanks in advance.
BP



_______________________________________________
users-list mailing list
users-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/users-list