2012-01-08 7 views
0

У меня есть таблица t1, что имеет столбец t1.subgroup смешанные идентификаторы в нем. Некоторые из них простых числовых значений и некоторые из них имеют префикс: a0Результаты исключения из MySql таблицы

2, 554, 9844, a0433, 4363, a0565 ...

В действительности значение, как a0433 и a0565 фактически соответствуют до 433 и 565 в другой таблице.

Мне нужно написать запрос, который будет исключать определенные значения из результатов t1, когда мне задан набор числовых идентификаторов.

SELECT * FROM t1 WHERE t1.group = 2 
AND t1.subgroup NOT IN(9844, 433, 565) 

Как это сделать?

ответ

1
SELECT [your fields] FROM t1 WHERE t1.group = 2 
AND replace(t1.subgroup,'a0','') NOT IN(9844, 433, 565) 

Хотя производительность может быть не лучшей. Он также предполагает, что mysql делает преобразование implict для строки в int и int для строки для этого compairison, или для замены потребуется выполнить преобразование.

2
SELECT * FROM t1 WHERE t1.group = 2 
AND 
REPLACE(t1.subgroup, 'a0', '') NOT IN (SELECT ThatValue) FROM AnotherTable) 

Однако это не удастся, если любые значения NULL. Так

SELECT * 
FROM 
    t1 
WHERE 
    t1.group = 2 
    AND 
    NOT EXISTS (SELECT * FROM AnotherTable A 
       WHERE 
       REPLACE(t1.subgroup, 'a0', '') = A.ThatValue) 

Edit: добавлена ​​REPLACE, удалены CONCAT

0

Очевидно, что ваша колонка t1.subgroup является VARCHAR или аналогичный (некоторые текстуальное типа), так что вы хотели бы написать свой запрос как:

SELECT * FROM t1 WHERE t1.group = 2 
AND t1.subgroup NOT IN('9844', '433', '565') 
Смежные вопросы