3

編集:

そのため、具体的に何をしたいのかについて混乱があるようですので、例を変更します。

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

したがって、どちらの列からも一致しない結果はすべて無効になり、両方が存在する場合は両方が取得されることに気付くでしょう。

4

4 に答える 4

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'

しかし、実際には、どのフィールドが一致しても、それは 'Smith' になります。

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


編集:編集した質問に基づいて...

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%'
;
于 2012-05-31T18:05:02.793 に答える
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
;

性能についてはお約束できません。

null を文字列として表示しても構わない場合は、次の方法を試してください。

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%';

結合なしの 1 回のフル テーブル スキャン。これは良いかもしれません。

于 2012-05-31T22:40:06.087 に答える
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';
于 2012-05-31T18:06:06.477 に答える
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'
于 2012-05-31T18:06:43.770 に答える