2009-09-30 3 views
0

У меня есть три колонки с тремя значениями, которые могут быть установлены для каждого столбцаMySQL Query помощь

Column_1 | column_2 | column_3 
________ | ________ | ________ 
COMPLETED| FAILED | PENDING 
COMPLETED| COMPLETED| COMPLETED 
FAILED | COMPLETED| COMPLETED 
COMPLETED| PENDING | COMPLETED 
COMPLETED| COMPLETED| PENDING 
COMPLETED| COMPLETED| COMPLETED 
COMPLETED| COMPLETED| COMPLETED 
PENDING | COMPLETED| COMPLETED 

Цель двух запросов, один, чтобы найти какой-либо записи с ожидающим статусом, а другой, чтобы найти какие-либо записи с FAILED Статус

ПРИМЕЧАНИЕ: ОЖИДАНИЕ и не должны иметь ту же самую логику

Query: PENDING 
SELECT * FROM tbl 
WHERE Column_1 = 'PENDING' OR Column_2 = 'PENDING' OR Column_3 = 'PENDING' 

Query: FAILED 
SELECT * FROM tbl 
WHERE Column_1 = 'FAILED' OR Column_2 = 'FAILED' OR Column_3 = 'FAILED' 

Эти запросы не вытягивать правильные записи. Я думаю, что это соответствует первому условию в предложении WHERE, а затем делает предложение OR как отдельное условие. Я пробовал пару вариантов, но до сих пор не повезло.

Alt Query: 
SELECT * FROM tbl 
WHERE Column_1 OR Column_2 OR Column_3 = 'PENDING' 

Так что для PENDING статуса, запрос должен возвращать 4 строки для сетки данных выше и для неисправного состояния, запрос должен возвращать 2 строки по сетке данных выше

+0

Ваш первый набор запросов выглядит хорошо - в чем проблема? – Greg

+0

что вы получаете? эти первые 2 запроса выглядят отлично на первый взгляд для меня ... никогда не пробовали этот стиль запроса alt раньше ... но это выглядит смешно для меня :) – danb

+0

Это заставляет условие WHERE быть отдельным ограничением, поэтому условия OR рассматриваются как отдельное ограничение. Имеет ли это смысл? –

ответ

2

Try оберточной скобки вокруг каждое условие, чтобы увидеть, если это работает:

SELECT * FROM tbl 
WHERE (Column_1 = 'PENDING') OR (Column_2 = 'PENDING') OR (Column_3 = 'PENDING') 

Я на самом деле не знаком с MySQL, но это может быть лучше, кто-то может исправить меня, если я ошибаюсь:

SELECT * FROM ТПС WHERE 'ОЖИДАНИИ' IN (Column_1, Column_2, Column_3, Column_4)

Опять же, если выше неправильно, я извиняюсь.

+0

Спасибо, что сделал трюк –

+1

Phill, делает этот вариант IN также. Просто любопытно – Xaisoft

+0

Мне тоже нравится обновление, выглядит чище, чем все условия OR. Еще раз спасибо –

1

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

+0

Быстрый способ проверить это будет сменить запросы на использование LIKE; то есть "WHERE column_1 LIKE" PENDING% "ИЛИ column_2 =" PENDING% "...". Если это работает, ясно, что у вас проблемы с пространством. – AgentConundrum

+0

Использование типов данных VARHCAR –

+0

Нет проблем с пространством, поскольку данные вводятся скриптом и обрезаются перед вставкой –

0

Если поведение странно, я бы попытался скопировать.

Query: PENDING 
SELECT * FROM tbl 
WHERE ((Column_1 = 'PENDING') OR (Column_2 = 'PENDING') OR (Column_3 = 'PENDING')) 

Query: FAILED 
SELECT * FROM tbl 
WHERE ((Column_1 = 'FAILED') OR (Column_2 = 'FAILED') OR (Column_3 = 'FAILED')) 

Хотя, я буду честен, я не знаю, почему это будет работать лучше/хуже: так как все, что вы используете «ИЛИ» это должно не важно.

0
SELECT * FROM tbl 
WHERE Column_1 OR Column_2 OR Column_3 = 'PENDING' 

Это, безусловно, не собирается вернуть то, что вы думаете. Вот как это оценивается:

SELECT * FROM tbl 
WHERE (Column_1) OR (Column_2) OR (Column_3 = 'PENDING') 

Использование столбца строки как термин истина вычисляет строку как целое число, которое в этих примерах, равно 0, интерпретируется как false. Так что это как:

WHERE (false) OR (false) OR (Column_3 = 'PENDING') 

Эффект в том, что она игнорирует первые два столбца и возвращает строки только там, где третий столбец матчей 'PENDING'.

Другими словами, вы дали синтаксически обоснованный запрос, но не имеете результата, который вы намереваетесь использовать.

Первые два запроса, которые вы указали, возвращают 4 строки, где любой столбец 'PENDING' и две строки, где любой столбец 'FAILED'. Я просто тестировал это, и он работает.Если он не соответствует вашим ожиданиям, возможно, вы можете уточнить:

  • Какой запрос вы пытаетесь?
  • Что было возвращено?
  • Какой результат вы ожидали вместо этого?
+0

Билл, Любопытно, делает ли t-sql или pl-sql то же самое? – Xaisoft

+0

Почему в этом случае строки превращаются в 0, а не в 1. – Xaisoft

+0

В MySQL, приведение строки к целому числу использует любые ведущие числовые цифры в строке, по умолчанию - 0, если их нет. Таким образом, '123abc'' отличает целое число 123, но' 'abc123'' отбрасывает целое число 0. –

Смежные вопросы