Используя sql, где в операторе с числами - PullRequest
0 голосов
/ 05 марта 2020

Я пытался найти отдельных пользователей со схожими интересами и наткнулся на эту проблему. По сути, я хотел сделать что-то вроде:

SELECT DISTINCT(uid) 
FROM interest 
WHERE (interest , score) IN (('family' , > 0.32), ('paris' , > 0.77));

Я понял, что могу объединить несколько операторов where для достижения этой цели, но это был бы более чистый подход. Возможно ли это сделать?

Ответы [ 2 ]

3 голосов
/ 05 марта 2020

IN не принимает операторов. Он принимает скалярные значения / кортежи или подзапрос, который возвращает скалярные значения / кортежи. Я думаю, что вы хотите:

SELECT DISTINCT uid
FROM interest 
WHERE (interest = 'family' AND score > 0.32) OR
      (interest = 'paris' AND score > 0.77);

Вы могли бы express это как:

SELECT DISTINCT i.uid
FROM interest i JOIN
     (VALUES ('family', 0.32), ('paris', 0.77)
     ) v(interest, threshold)
     ON i.interest = v.interest and i.score > v.threshold
2 голосов
/ 05 марта 2020

Вы пытаетесь использовать «кортежи».

В PostgreSQL кортежи могут работать с неравенствами или неравенствами. В любом случае ВСЕ значения будут участвовать либо в равенстве, либо в неравенстве. Вы не можете смешивать операцию для разных частей кортежа, как пытаетесь сделать: равенство для первого элемента, неравенство для второго. Следовательно, в этом случае вы не сможете использовать кортежи.

Решение гораздо проще. Просто используйте комбинированный предикат с оператором OR, например:

SELECT DISTINCT(uid) 
FROM interest 
WHERE interest = 'family' and score > 0.32
   or interest = 'paris' and score > 0.77;
...