Предложение SQL WHERE выполняется с AND, но не с OR

#sql #apache-drill

#sql #apache-drill

Вопрос:

Ниже приведен SQL-запрос, который отфильтровывает записи на основе поля даты в предложении WHERE. У меня есть два разных атрибута даты.

 SELECT * FROM MY_TABLE WHERE DATE1 >= '2002-01-01' OR DATE2 >= '2002-01-01';
 

Этот SQL выдает ошибку чтения данных. Но когда я заменяю на OR with AND , он работает нормально.

Как мне фильтровать записи, чтобы выбрать любую запись, у которой любая из дат больше некоторой произвольной даты?

ПРАВКА1

Я чувствую, что мои вопросы были довольно неполными. Я использую механизм запросов apache drill. Кроме того, фактический запрос представляет собой объединение двух таблиц с 2 столбцами даты, расположенными в двух разных объединенных таблицах, как показано ниже

    SELECT
        A.id AS my_id,
        B.is_active is_active,
        C.other_id AS id2
    FROM
        A
        INNER JOIN B ON A.id = B.id
        INNER JOIN C ON C.id = A.id
    WHERE
        A.date >= '2002-01-01' OR
        B.date >= '2002-01-01';
 

ПРАВКА2

Ниже приведено мое сообщение об ошибке

 SQL Error: DATA_READ ERROR: The JDBC storage plugin failed while trying setup the SQL query. 

 

Комментарии:

1. У вас есть столбцы date1 и date2 в вашей таблице?

2. Вероятно, вам следует использовать литералы даты. '2002-01-01' является строкой, а DATE '2002-01-01' является датой. Однако в вашей СУБД это может отличаться или может просто не иметь значения. Какую СУБД вы используете?

3. @a_horse_with_no_name отредактировал мой вопрос

4. @ThorstenKettner готово

5. кроме того, это таблицы postgresql

Ответ №1:

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

     SELECT
        A.id AS my_id,
        B.is_active is_active
    FROM
        A
        INNER JOIN B ON A.id = B.id
    WHERE
        A.date >= '2002-01-01' OR
        B.date >= '2002-01-01';
 

Комментарии:

1. AND выбирает меньше строк, чем OR . Возможно, некоторые из этих дополнительных строк находятся в секторе на диске, который по какой-то причине недоступен для чтения. Удалив таблицу из запроса, вы, возможно, удалили именно те строки, в которых есть эта проблема. (Если это правда, то сообщение об ошибке странное. Вместо сообщения об ошибке синтаксического анализа — вот как я интерпретирую это сообщение — система должна сообщить об ошибке во время выполнения.)

2. да, я тоже не понял, что означает сообщение об ошибке. Но, спасибо, это хорошее представление о том, что здесь происходит! @ThorstenKettner