postgres有一个数组数据类型,在本例中是一个数字数组:
CREATE TABLE sal_emp (name text, pay_by_quarter integer[]);
INSERT INTO sal_emp VALUES ('one', '{1,2,3}');
INSERT INTO sal_emp VALUES ('two', '{4,5,6}');
INSERT INTO sal_emp VALUES ('three', '{2,4,6}');
SELECT * FROM sal_emp;
Result:
one, {1,2,3}
two, {4,5,6}
three, {2,4,6}
Run Code Online (Sandbox Code Playgroud)
据我所知,您只能按如下方式查询数组:
SELECT * FROM sal_emp WHERE 4=ANY(pay_by_quarter);
SELECT * FROM sal_emp WHERE ARRAY[4,5,6]=pay_by_quarter;
Run Code Online (Sandbox Code Playgroud)
这意味着您可以选择一个数组包含单个参数匹配的行,或者整个数组是否与数组参数匹配.
我需要选择一行,其中行的数组的任何成员都匹配参数数组的任何成员 - 有点像'IN',但我无法弄清楚如何.我尝试了以下两种方法,但都没有工作:
SELECT * from sal_emp WHERE ARRAY[4,5,6]=ANY(pay_by_quarter);
SELECT * from sal_emp WHERE ANY(pay_by_quarter) IN (4,5,6);
Run Code Online (Sandbox Code Playgroud)
我假设我可以做一些事情将数组转换为字符串,但这听起来像是糟糕的解决方案..
有任何想法吗?
我试图在数组中搜索具有某些键值对的行.我的BigQuery表中的一行看起来像这样.
{
"ip": "192.168.1.1",
"cookie" [
{
"key": "apple",
"value: "red"
},
{
"key": "orange",
"value: "orange"
},
{
"key": "grape",
"value: "purple"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我考虑使用隐式UNNEST或CROSS JOIN,如下所示,但它不起作用,因为取消它只会创建多个不同的行.
SELECT ip
FROM table t, t.cookie c
WHERE (c.key = "grape" AND c.value ="purple") AND (c.key = "orange" AND c.value ="orange")
Run Code Online (Sandbox Code Playgroud)
这个链接非常接近我想做的事情,除非它们正在使用legacy SQL而不是standardSQL
我想知道是否有人知道在BigQuery中测量字符串相似度的方法。
似乎将具有一个整洁的功能。
我的情况是我需要比较两个URL的相似性,以确保它们引用同一篇文章。
我可以找到使用javascript的示例,因此也许可以使用UDF,但是我根本没有使用过UDF(或者使用javascript :))
只是想知道是否可以使用现有的regex函数,或者是否有人可以让我开始将javascript示例移植到UDF中。
任何帮助,不胜感激,谢谢
编辑:添加一些示例代码
因此,如果我将UDF定义为:
// distance function
function levenshteinDistance (row, emit) {
//if (row.inputA.length <= 0 ) {var myresult = row.inputB.length};
if (typeof row.inputA === 'undefined') {var myresult = 1};
if (typeof row.inputB === 'undefined') {var myresult = 1};
//if (row.inputB.length <= 0 ) {var myresult = row.inputA.length};
var myresult = Math.min(
levenshteinDistance(row.inputA.substr(1), row.inputB) + 1,
levenshteinDistance(row.inputB.substr(1), row.inputA) + 1,
levenshteinDistance(row.inputA.substr(1), row.inputB.substr(1)) + (row.inputA[0] !== row.inputB[0] ? 1 : 0)
) + 1; …Run Code Online (Sandbox Code Playgroud)