2012-05-31 2 views
3

Edit:Игнорировать столбец на основе, где положение

Таким образом, кажется, есть некоторая путаница в частности, то, что я хочу сделать, так что я собираюсь изменить свой пример.

У меня есть таблица с именем example_table:

id  code1  code2 
------------------------- 
1  1780  4245 
2  1781  4280 
3  1900  1200 
4  2800  4217 
5  2817  1782 

С этим я хочу найти что-то подобное,

SELECT * FROM example_table WHERE code1 LIKE '%17%' OR code2 LIKE '%17%'; 

Я хочу, чтобы это вернуть

id  code1  code2 
------------------------ 
1  1780  null 
2  1781  null 
4  null  4217 
5  2817  1782 

Так вы» ll замечает, что это ниспровержает любой результат, который не соответствует ни одному из столбцов, и если оба присутствуют, он будет захватывать оба.

+0

Что делать, если девичья фамилия Сьюзи была 'Уокер', и вы искали' Уокер'? Какими будут результаты? Ясно, что и Сьюзи, и Джонни должны быть возвращены, но с какими столбцами: 'first_name' и ...? – eggyal

+0

@eggyal Должно быть: Джонни Уокер и Сьюзи Уокер, оставив Смита на Сьюзи. Если фамилия Сьюзи была также Уокер, то оба должны быть включены. –

+0

Я получаю это, но как будет выглядеть название этого второго столбца? Это не 'last_name', не' maiden_name', так как это смесь обоих. Фактически, он содержит только значение 'Смит' для всех, поэтому давайте просто назовем его' Смит'. Или зачем вообще его включать? – eggyal

ответ

1

Этот SQL-код должен сделать это для вас

SELECT 
    A.id,B.code1,C.code2 
FROM 
    (SELECT id FROM example_table) A 
    LEFT JOIN 
    (
     SELECT id,code1 FROM example_table 
     WHERE code1 LIKE '%17%' 
    ) B ON A.id=B.id 
    LEFT JOIN 
    (
     SELECT id,code2 FROM example_table 
     WHERE code2 LIKE '%17%' 
    ) C ON A.id=C.id 
WHERE 
    ISNULL(B.code1) = 0 OR ISNULL(C.code1) = 0 
; 

Я не могу давать никаких обещаний по производительности для него.

Если вы не против представления нулевой в виде строки, попробуйте это один:

SELECT 
    id, 
    IF(code1 LIKE '%17%',code1,'null') code1, 
    IF(code2 LIKE '%17%',code2,'null') code2 
FROM example_table WHERE 
    code1 LIKE '%17%' OR 
    code2 LIKE '%17%'; 

Один полный просмотр таблицы с не включается. Это может быть лучше.

+0

Получение очень, очень близко. Прямо сейчас у меня есть инструкция if на 'id'. Это все равно возвращает строку, но со всеми значениями Null. Если все значения (или 'code1' и' code2' равны нулю), я не хочу эту строку вообще. –

+0

Я обновил свой ответ с соответствующим предложением WHERE – RolandoMySQLDBA

+0

В соответствии с изменением моего ответа (с момента публикации ответа); вам не нужно, чтобы NULL были строками. – MatBailie

5

Буквально, вы могли бы сделать что-то вроде этого ...

SELECT 
    first_name, 
    CASE WHEN last_name = 'Smith' THEN last_name ELSE maiden_name END 
FROM 
    users 
WHERE 
    last_name = 'Smith' 
    OR maiden_name = 'Smith' 

Но, на самом деле, все, что поле матчи, это будет «Смит», так зачем, просто это сделать?

SELECT 
    first_name, 
    'Smith' 
FROM 
    users 
WHERE 
    last_name = 'Smith' 
    OR maiden_name = 'Smith' 


EDIT: Основываясь на вашем Editted вопрос ...

SELECT 
    id, 
    CASE WHEN code1 LIKE '%17%' THEN code1 ELSE NULL END AS code1, 
    CASE WHEN code2 LIKE '%17%' THEN code2 ELSE NULL END AS code2 
FROM 
    example_table 
WHERE 
    code1 LIKE '%17%' 
    OR code2 LIKE '%17%' 
; 
0

Вы можете сделать это элегантно с UNION:

SELECT first_name, last_name FROM users WHERE last_name='Smith' 
    UNION 
SELECT first_name, maiden_name FROM users WHERE maiden_name='Smith'; 

или несколько менее элегантно с CASE заявление:

SELECT first_name, 
    CASE WHEN last_name='Smith' THEN last_name 
    ELSE maiden_name END 
    AS last_name 
FROM users where last_name='Smith' or maiden_name='Smith'; 

, который, как @Dems указывает, может быть упрощена:

SELECT first_name, 'Smith' AS last_name 
FROM users WHERE last_name='Smith' or maiden_name='Smith'; 

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

SELECT first_name FROM users 
WHERE last_name='Smith' or maiden_name='Smith'; 
0

ли вы имеете в виду

SELECT 
    first_name, 
    IF(last_name='Smith',last_name,concat(last_name,' (née ',maiden_name,')')) AS last_name 
FROM 
    users 
WHERE 
    users.last_name='Smith' 
    OR maiden_name='Smith' 
Смежные вопросы