Почему SQLite условно между сгенерированными переменными не сравнивается правильно? - PullRequest
0 голосов
/ 10 мая 2018

Я немного запутался, почему я получаю результаты в следующем примере. Давайте представим, что мы хотим оценить, насколько кто-то любит животных. Им больше нравится любой цветной тигр, вторые рыжие животные, а другие нет.

Рассмотрим следующую таблицу:

----------------------
| Color  | Animal    |
----------------------
| Yellow | Butterfly |
| Red    | Lion      |
| Red    | Tiger     |
| Green  | Lion      | 
| Green  | Donkey    |
| Yellow | Tiger     |
----------------------

Теперь, когда я запускаю этот код:

CREATE VIEW animal_colors as select "farm"."color" as "color",
CASE WHEN "farm"."color" = 'Red' THEN 1 ELSE 0 END AS "color_red",
CASE WHEN "farm"."animal" = 'Tiger' THEN 1 ELSE 0 END AS "animal_tiger",
CASE
    WHEN "animal_tiger" = 1 THEN 1
    WHEN "color_red" = 1 THEN 0
    ELSE -1
END 
AS "rank"

FROM "farm"

Я получаю следующий вывод:

----------------------------------------------------------
| Color  | Animal    | color_red | animal_tiger | rank  |
---------------------------------------------------------
| Yellow | Butterfly | 0         | 0            | -1    |
| Red    | Lion      | 1         | 0            | -1    |
| Red    | Tiger     | 1         | 1            | -1    |
| Green  | Lion      | 0         | 0            | -1    |
| Green  | Donkey    | 0         | 0            | -1    |
| Yellow | Tiger     | 0         | 1            | -1    |
---------------------------------------------------------

Я думал, что сравнивал переменные color_red и animal_tiger, чтобы увидеть, равны ли они единице, но похоже, что это не так. Может ли кто-нибудь пролить свет на то, почему выражение всегда оценивается как -1?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы сравниваете "animal_tiger" (строку) с "Tiger", что не соответствует действительности.

Чтобы получить доступ к производным столбцам animal_tiger и color_red, вам нужно сделать выбор подзапросом или использовать фактические столбцы.

Таким образом, вы можете использовать любой (не используя производные столбцы): -

SELECT farm.color AS color,
    CASE
        WHEN farm.color = 'Red' THEN 1 ELSE 0 END AS color_red,
    CASE 
        WHEN farm.animal = 'Tiger' THEN 1 ELSE 0 END AS animal_tiger,
    CASE 
        WHEN farm.animal = 'Tiger' THEN 1
        WHEN farm.color = 'Red' THEN 0
        ELSE -1
        END AS rank
FROM farm;

в результате

enter image description here

или (используя производные столбцы через подзапрос): -

SELECT *, 
    CASE 
        WHEN animal_tiger = 1 THEN 1
        WHEN color_red = 1 THEN 0
        ELSE -1
        END AS rank
 FROM (
    SELECT "farm"."color" as "color",
    CASE WHEN "farm"."color" = 'Red' THEN 1 ELSE 0 END AS "color_red",
    CASE WHEN "farm"."animal" = 'Tiger' THEN 1 ELSE 0 END AS "animal_tiger"
    FROM "farm"
);

В результате: -

enter image description here

Примечание сделано для выбора, а не для создания VIEWS для моего удобства

Дополнительный

Возможно, вы могли бы упростить использование следующего в качестве основы: -

SELECT farm.color AS color, 
    -1 + (farm.color = 'Red') + (farm.animal = 'Tiger') AS rank 
FROM farm

Это дает: -

enter image description here

Или, может быть, даже

SELECT farm.color AS color, 
    0 + (farm.color = 'Red') + ((farm.animal = 'Tiger') * 2) AS rank 
FROM farm

(присвоив ранговому основанию ноль и присвоив тигру более высокий ранг, чем красному, таким образом, вы можете легко различить, скажем, красного и желтого тигра, первый из которых имеет более высокий ранг)

Это даст: -

enter image description here

0 голосов
/ 11 мая 2018

Попробуй это. Первоначально у меня был неправильный синтаксис для оператора выражения muli-when.

CREATE VIEW "animal_colors" as select "farm"."color" as "color",
 CASE WHEN "farm"."color" = 'Red' THEN 1 ELSE 0 END AS "color_red",
 CASE WHEN "farm"."animal" = 'Tiger' THEN 1 ELSE 0 END AS "animal_tiger",
 CASE WHEN "farm"."animal" = 'Tiger' THEN 1
      WHEN "farm"."color" = 'Red' THEN 0
      ELSE -1 END as "rank" 
FROM "farm"

, что дает

color       color_red   animal_tiger    rank
"Yellow"    "0"         "0"             "-1"
"Red"       "1"         "0"             "0"
"Red"       "1"         "1"             "1"
"Green"     "0"         "0"             "-1"
"Green"     "0"         "0"             "-1"
"Yellow"    "0"         "1"             "1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...