PostgreSQL просмотр встроенных операторов if - PullRequest
1 голос
/ 04 января 2012

В моей базе данных, для магазинов, которые не имеют рейтинга по рейтингу посредников, у них все еще есть запись, но вместо числа от 0.0 до 10.0 есть -1.0. Следующий запрос приводит к отображению -10.00 в моем представлении для тех магазинов с -1.0. Вместо этого мне бы хотелось, чтобы на его месте появлялось либо ничего, либо -, но мне не очень удобно внедрять встроенные операторы if в моем представлении. Вот мой текущий взгляд.

CREATE VIEW myview AS
SELECT co_url_name AS company_url, score_combined AS stella_score, trunc(score*10, 2) AS bizrate_score,
(SELECT trunc("lifetimeRating"*10, 2)) AS resellerRating_score
    FROM ss_profile_co AS s LEFT OUTER JOIN "resellerRatings_ratings" AS r
        ON s.id = r.company_id
            LEFT OUTER JOIN (SELECT * FROM bizrate_bizrate_ratings WHERE score_name = 'Overall rating') AS b
                ON s.id = b.fk_co_id
                    ORDER BY co_url_name ASC;

Строка (SELECT trunc("lifetimeRating"*10, 2)) AS resellerRating_score - это строка, которая возвращает отрицательные числа (или, для действительных записей, будет возвращать счет от 0.00 до 100.00).

Очевидно, я мог бы просто удалить эти записи из базы данных, что привело бы к этому, но это все равно наполовину опыт обучения и половина моих возможностей.

Я ценю помощь!

РЕДАКТИРОВАТЬ: Попытка встроенного, если, но не удивительно, получил ошибку.

IF (SELECT trunc("lifetimeRating"*10, 2)) = -10.00 THEN NULL ELSE (SELECT trunc("lifetimeRating"*10, 2)) AS resellerRating_score

EDIT2: разобрался. Рассматриваемая строка выглядит следующим образом:

(SELECT trunc("lifetimeRating"*10, 2) WHERE trunc("lifetimeRating"*10, 2) > 0) AS resellerrating_score

/ ForeverAlone

1 Ответ

2 голосов
/ 04 января 2012

Может выглядеть так:

CREATE VIEW myview AS
SELECT co_url_name AS company_url
      ,score_combined AS stella_score
      ,trunc(score * 10, 2) AS bizrate_score
      ,CASE WHEN "lifetimeRating" < 0
            THEN NULL
            ELSE trunc("lifetimeRating" * 10, 2)
       END AS resellerRating_score
FROM   ss_profile_co s
LEFT   JOIN "resellerRatings_ratings" r ON r.company_id = s.id
LEFT   JOIN bizrate_bizrate_ratings   b ON b.score_name = 'Overall rating' 
                                        AND b.fk_co_id = s.id
ORDER  BY co_url_name;

Основные моменты

  • Относительно вашего основного вопроса: дополнительный выбор без предложения FROM не имеет смысла.Я упростил это и вместо этого использовал оператор CASE.

  • Я также упростил ваш LEFT JOIN до bizrate_bizrate_ratings.Нет необходимости в дополнительном выборе.Я перенес предложение WHERE в состояние JOIN.Проще и быстрее.

  • Я бы посоветовал не использовать идентификаторы смешанного регистра , поэтому вам никогда не придется использовать двойные кавычки.(Это, вероятно, делает комментарий @Daniels недействительным, потому что lifetimerating! = "lifetimeRating"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...