Выберите строки со значением в поле и между двумя значениями в другом

Положив ответ Томаша Зато, я согласен с тем, что простое повторение массивов является самым быстрым. Кроме того (как уже отмечали другие), функцию следует называть равной / равной, а не сравнивать. В свете этого я модифицировал функцию, чтобы обрабатывать массивы для сходства - т. Е. Они имеют одни и те же элементы, но не в порядке - для личного использования, и я думал, что я брошу его здесь для всеобщего обозрения.

Array.prototype.equals = function (array, strict) {
    if (!array)
        return false;

    if (arguments.length == 1)
        strict = true;

    if (this.length != array.length)
        return false;

    for (var i = 0; i < this.length; i++) {
        if (this[i] instanceof Array && array[i] instanceof Array) {
            if (!this[i].equals(array[i], strict))
                return false;
        }
        else if (strict && this[i] != array[i]) {
            return false;
        }
        else if (!strict) {
            return this.sort().equals(array.sort(), true);
        }
    }
    return true;
}

Эта функция принимает дополнительный параметр strict, который по умолчанию имеет значение true. Этот строгий параметр определяет, должны ли массивы быть полностью равными как по содержимому, так и по порядку этого содержимого или просто содержать одно и то же содержимое.

Пример:

var arr1 = [1, 2, 3, 4];
var arr2 = [2, 1, 4, 3];  // Loosely equal to 1
var arr3 = [2, 2, 3, 4];  // Not equal to 1
var arr4 = [1, 2, 3, 4];  // Strictly equal to 1

arr1.equals(arr2);         // false
arr1.equals(arr2, false);  // true
arr1.equals(arr3);         // false
arr1.equals(arr3, false);  // false
arr1.equals(arr4);         // true
arr1.equals(arr4, false);  // true

I 've также написал быстрый jsfiddle с функцией и этим примером: http://jsfiddle.net/Roundaround/DLkxX/

1
задан marc_s 16 January 2019 в 05:19
поделиться

2 ответа

Этого можно достичь с помощью двух коррелированных подзапросов, используемых в качестве EXISTS условий фильтрации.

SELECT t.id, t.color, t.size
FROM mytable t
WHERE 
    t.size IN ('2XL', '3XL')
    AND EXISTS (SELECT 1 FROM mytable WHERE id = t.id AND color = t.color AND size = '2XL')
    AND EXISTS (SELECT 1 FROM mytable WHERE id = t.id AND color = t.color AND size = '3XL')

Другое решение заключается в использовании самосоединения:

SELECT t.id, t.color, t.size
FROM mytable t
INNER JOIN mytable t2 
    ON t2.id = t.id
    AND t2.color = t.color
    AND (
         ( t.size = '2XL' AND t2.size = '3XL' )
         OR ( t.size = '3XL' AND t2.size = '2XL' )
    )
0
ответ дан GMB 16 January 2019 в 05:19
поделиться

Вы можете использовать существует следующим образом:

select t.* from tablename t where
exists (
  select 1 from tablename where
  id = t.id and color = t.color and 
  size in ('2XL', '3XL') and t.size in ('2XL', '3XL') and
  size <> t.size
)
order by t.id, t.color, t.size
0
ответ дан forpas 16 January 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: