0

可能かどうかはわかりませんが、SELECT列を一致させないようにしています。列を持つテーブルがあるとしましょう:

id、、、、、、user_name_ color1_ color2_ fruit1_fruit2

ORの場合color1にのみ ID で行を選択したいと思います。、現在は互いに等しくなっています。== OR ==の場合、クエリは 0 行を返す必要があります。<>と==の場合、行は, ,のみを返す必要がありますcolor2fruit1fruit2color1color2fruit1fruit2color1color2fruit1fruit2iduser_namecolor1color2

ありがとう

4

3 に答える 3

0

これはかなり簡単なはずだと思います。

SELECT  id, user_name, color1, color2
FROM    tableName
WHERE   (color1 <> color2) AND (fruit1 = fruit2)
于 2013-03-18T02:30:44.033 に答える
0

最も簡単な方法は、ロジックを拡張して両方のケースを含めることです。

SELECT id, user_name, color1, color2, fruit1, fruit2
FROM myTable
WHERE (color1 <> color2 AND fruit1 = fruit2)
OR (color1 = color2 AND fruit1 <> fruit2)

あなたのコメントから、もう少し複雑なことを試す必要があります。

SELECT nonmatching.id, user_name, prop_name, value1, value2
FROM
(
    SELECT id, user_name, prop_name, value1, value2
    FROM
    (
        SELECT id, user_name, 'color' AS prop_name, 
            color1 AS value1, color2 AS value2
        FROM myTable
        UNION ALL
        SELECT id, user_name, 'fruit' AS prop_name, 
            fruit1 AS value1, fruit2 AS value2
        FROM myTable
    ) propertyExpanded
    WHERE value1 <> value2
) nonmatching

たとえば、1 つの不一致がある行のみを返したい場合は、次を追加できます。

INNER JOIN
(
    SELECT id, COUNT(1) AS mismatchCount = 1
    FROM
    (
        SELECT id, user_name, 'color' AS prop_name, 
            color1 AS value1, color2 AS value2
        FROM myTable
        UNION ALL
        SELECT id, user_name, 'fruit' AS prop_name, 
            fruit1 AS value1, fruit2 AS value2
        FROM myTable
    ) propertyExpanded
    WHERE value1 <> value2
    GROUP BY id
) nonmatchingCount ON nonmatching.id = nonmatchingCount.id
WHERE nonmatchingCount.mismatchCount = 1
于 2013-03-18T02:31:52.173 に答える
0

これはうまくいくはずです:

SELECT id,
       user_name,
       color1,
       color2
FROM mytable
WHERE (color1 = color2) != (fruit1 = fruit2)

ここでのトリックは、比較の結果をブール値として比較していることです。

このアプローチは、2 種類以上の正確な単一データ一致をサポートするように一般化できます。つまり、次のように一致をカウントすることで、同様のトリックを使用できます。

SELECT * FROM mytable
WHERE (color1 = color2)
    + (fruit1 = fruit2)
    + ...
    + (kind1  = kind2)
    = 1

このクエリでは、ブール値のFALSEorTRUEが暗黙的に0orにキャストされ1ます。

したがって、このクエリは、ちょうど 1 つの種類が一致する場合にのみ行を生成します。

于 2013-03-18T02:32:41.843 に答える