2017-04-03 7 views
0

MySQLのフィールドが同じ値(ポート番号)を持つことができるが、ホストIDに基づいて2つの異なるデバイスを表すことができる条件があります。私は、次のを持っているが、動作していないよう:MySQLのcase文の余分なカラムの状態が正しく動作しない

SELECT s.name AS 'ingester', 
    d.dev_used AS 'size', 
    Cast(CASE d.namespace_port 
     (WHEN 4015 AND d.das_station IN(11,22,23)) THEN 'BPN1' 
     (WHEN 4015 AND d.das_station NOT IN(11,22,23)) THEN 'SJC12' 
     WHEN 4016 THEN 'SJC17' 
     WHEN 4017 THEN 'SJC18' 
     WHEN 4018 THEN 'SJC19' 
     WHEN 4019 THEN 'SJC5' 
     WHEN 4020 THEN 'SJC6' 
     WHEN 4021 THEN 'SJC7' 
     WHEN 4022 THEN 'SJC8' 
     WHEN 4023 THEN 'SJC9' 
     WHEN 4024 THEN 'SJC10' 
     WHEN 4025 THEN 'SJC11' 
     WHEN 4026 THEN 'SJC20' 
     WHEN 4027 THEN 'SJC13' 
     WHEN 4028 THEN 'SJC14' 
     WHEN 4029 THEN 'SJC15' 
     WHEN 4030 THEN 'SJC16' 
    END AS CHAR) AS namespace, 
    Date_format(d.date_attached, '%b-%e-%Y %l:%i %p') AS 'date_attached', 
    Date_format(d.replication_started, '%b-%e-%Y %l:%i %p') AS 'date_started', 
    Date_format(d.replication_completed, '%b-%e-%Y %l:%i %p') AS 'date_finished', 
    Date_format(d.date_detached, '%b-%e-%Y %l:%i %p') AS 'date_detached' 
FROM das.stations s, 
     das.device d 
WHERE d.das_station = s.id 
AND svcid = "trrq" 
ORDER BY d.date_attached DESC 

MYSQL CASE STATEMENT MULTIPLE CONDITIONSを読んで、可能でなければなりませんようだが、私は試してみて、クエリを実行すると、私は次の取得:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '4015 AND d.das_station IN(11,22,23)) THEN 'BPN1' 
4015 AND d.das_station NOT IN (1' at line 4 

このようなケースステートメント内にAND条件を設定することはできませんか?

編集:

:それは私は行が折り返さ削除する場合は、クエリに

mysql> SELECT s.name AS 'ingester', 
    ->  d.dev_used AS 'size', 
    ->  Cast(CASE d.namespace_port 
    -> 
Display all 891 possibilities? (y or n) 
    -> (4015 AND d.das_station IN (11,22,23)) THEN 'BPN1' 
    -> 
Display all 891 possibilities? (y or n) 
    -> (4015 AND d.das_station NOT IN (11,22,23)) THEN 'SJC12' 
    ->   WHEN 4016 THEN 'SJC17' 
    ->   WHEN 4017 THEN 'SJC18' 
    ->   WHEN 4018 THEN 'SJC19' 
    ->   WHEN 4019 THEN 'SJC5' 
    ->   WHEN 4020 THEN 'SJC6' 
    ->   WHEN 4021 THEN 'SJC7' 
    ->   WHEN 4022 THEN 'SJC8' 
    ->   WHEN 4023 THEN 'SJC9' 
    ->   WHEN 4024 THEN 'SJC10' 
    ->   WHEN 4025 THEN 'SJC11' 
    ->   WHEN 4026 THEN 'SJC20' 
    ->   WHEN 4027 THEN 'SJC13' 
    ->   WHEN 4028 THEN 'SJC14' 
    ->   WHEN 4029 THEN 'SJC15' 
    ->   WHEN 4030 THEN 'SJC16' 
    ->  END AS CHAR) AS namespace, 
    ->  Date_format(d.date_attached, '%b-%e-%Y %l:%i %p') AS 'date_attached', 
    ->  Date_format(d.replication_started, '%b-%e-%Y %l:%i %p') AS 'date_started', 
    ->  Date_format(d.replication_completed, '%b-%e-%Y %l:%i %p') AS 'date_finished', 
    ->  Date_format(d.date_detached, '%b-%e-%Y %l:%i %p') AS 'date_detached' 
    -> FROM das.stations s, 
    ->  das.device d 
    -> WHERE d.das_station = s.id 
    -> AND svcid = "trrq" 
    -> ORDER BY d.date_attached DESC 

を好きではないのMysqlに貼り付けているようだ、しかし、まだ2番目のフィールドを尊重していない、正しく貼り付けるように見えます

mysql> SELECT s.name AS 'ingester', d.das_station, d.dev_used AS 'size',  Cast(CASE d.namespace_port WHEN (4015 AND d.das_station = 11) THEN 'BPN1' WHEN (4015 AND d.das_station NOT IN(11,22,23)) THEN 'SJC12' WHEN 4016 THEN 'SJC17' WHEN 4017 THEN 'SJC18' WHEN 4018 THEN 'SJC19' WHEN 4019 THEN 'SJC5' WHEN 4020 THEN 'SJC6' WHEN 4021 THEN 'SJC7' WHEN 4022 THEN 'SJC8' WHEN 4023 THEN 'SJC9' WHEN 4024 THEN 'SJC10' WHEN 4025 THEN 'SJC11' WHEN 4026 THEN 'SJC20' WHEN 4027 THEN 'SJC13' WHEN 4028 THEN 'SJC14' WHEN 4029 THEN 'SJC15' WHEN 4030 THEN 'SJC16' END AS CHAR) AS namespace,  Date_format(d.date_attached, '%b-%e-%Y %l:%i %p') AS 'date_attached',  Date_format(d.replication_started, '%b-%e-%Y %l:%i %p') AS 'date_started',  Date_format(d.replication_completed, '%b-%e-%Y %l:%i %p') AS 'date_finished',  Date_format(d.date_detached, '%b-%e-%Y %l:%i %p') AS 'date_detached' FROM das.stations s,  das.device d WHERE d.das_station = s.id AND svcid = "trrq" ORDER BY d.date_attached DESC; 
+---------------+-------------+------+-----------+---------------------+--------------+---------------------+---------------------+ 
| ingester  | das_station | size | namespace | date_attached  | date_started | date_finished  | date_detached  | 
+---------------+-------------+------+-----------+---------------------+--------------+---------------------+---------------------+ 
| ca-adsdas2-p1 |   11 | NULL | NULL  | Jan-20-2016 1:42 PM | NULL   | NULL    | Jan-21-2016 3:16 PM | 
| ca-adsdas2-p1 |   11 | NULL | NULL  | Dec-21-2015 7:25 PM | NULL   | Dec-26-2015 9:22 PM | Jan-20-2016 1:33 PM | 
+---------------+-------------+------+-----------+---------------------+--------------+---------------------+---------------------+ 

das_station = 11の場合、nullではなく、名前空間に「BPN1」と表示されます。

答えて

0

は、次のような、WHENsでnamespace_portを含むことによって解決:以下で

SELECT s.name AS 'ingester', 
    d.dev_used AS 'size', 
    Cast(CASE WHEN (d.namespace_port = 4015 AND d.das_station IN (11,22,23)) THEN 'BPN1' WHEN (d.namespace_port = 4015 AND d.das_station NOT IN (11,22,23)) THEN 'SJC12' WHEN d.namespace_port = 4016 THEN 'SJC17' WHEN d.namespace_port = 4017 THEN 'SJC18' WHEN d.namespace_port = 4018 THEN 'SJC19' WHEN d.namespace_port = 4019 THEN 'SJC5' WHEN d.namespace_port = 4020 THEN 'SJC6' WHEN d.namespace_port = 4021 THEN 'SJC7' WHEN d.namespace_port = 4022 THEN 'SJC8' WHEN d.namespace_port = 4023 THEN 'SJC9' WHEN d.namespace_port = 4024 THEN 'SJC10' WHEN d.namespace_port = 4025 THEN 'SJC11' WHEN d.namespace_port = 4026 THEN 'SJC20' WHEN d.namespace_port = 4027 THEN 'SJC13' WHEN d.namespace_port = 4028 THEN 'SJC14' WHEN d.namespace_port = 4029 THEN 'SJC15' WHEN d.namespace_port = 4030 THEN 'SJC16' END AS CHAR) AS namespace, 
    Date_format(d.date_attached, '%b-%e-%Y %l:%i %p') AS 'date_attached', 
    Date_format(d.replication_started, '%b-%e-%Y %l:%i %p') AS 'date_started', 
    Date_format(d.replication_completed, '%b-%e-%Y %l:%i %p') AS 'date_finished', 
    Date_format(d.date_detached, '%b-%e-%Y %l:%i %p') AS 'date_detached' 
FROM das.stations s, 
     das.device d 
WHERE d.das_station = s.id 
AND svcid = "96wa" 
ORDER BY d.date_attached DESC 

結果:

+------------------+--------------+-----------+---------------------+---------------------+----------------------+---------------------+ 
| ingester   | size   | namespace | date_attached  | date_started  | date_finished  | date_detached  | 
+------------------+--------------+-----------+---------------------+---------------------+----------------------+---------------------+ 
| bpn-dasingest-p2 |   NULL | NULL  | Mar-29-2017 7:41 AM | NULL    | NULL     | Mar-30-2017 8:58 AM | 
| bpn-dasingest-p2 | 247547875328 | BPN1  | Mar-27-2017 7:55 AM | Mar-27-2017 9:33 AM | Mar-27-2017 12:27 PM | Mar-29-2017 7:41 AM | 
+------------------+--------------+-----------+---------------------+---------------------+----------------------+---------------------+ 
+0

は、あなたがこの問題を解決するために、あなたが行った重要な変更を見下ろすされています。あなたは[CASE'表現の2つのスタイル(https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html)を完全に切り替えました。 'CASE value WHEN [compare_value] THEN result ...'から 'case when WHEN [condition] THEN result ...'に切り替えました。あなたのオリジナルでは、 'WHEN'の後に比較*の値が続きます。 '(4015 AND d.das_station NOT IN(11,22,23))'は、意味のある方法でnamespace_portの値と一致しない1または0にしかならない論理式です。 –

+0

@ Michael-sqlbotコメントありがとうございます。それは実際にどのように私がそれをキャッチしたか...私が投稿した最初のリンクを見直した後、私は、前の投稿がそれぞれのWHENステートメントの両方の条件を含んでいたのではなく、ステートメント全体に2番目のフィールドを追加しようとしていたCASEステートメント。私の2番目の問題は、何らかの理由でPHPがスペースを使ってファイル全体を読むことができるのに対し、コピー+ペーストはMySQLクライアントにとって寛容ではなく、私の "WHEN" –

関連する問題