Моделирование ПОЛЯ ORDER BY MySQL () в Postgresql

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

Надеюсь, что это помогает.

42
задан Igor Jerosimić 14 June 2019 в 08:00
поделиться

7 ответов

Ах, gahooa было так близко:

SELECT * FROM currency_codes
  ORDER BY
  CASE
    WHEN code='USD' THEN 1
    WHEN code='CAD' THEN 2
    WHEN code='AUD' THEN 3
    WHEN code='BBD' THEN 4
    WHEN code='EUR' THEN 5
    WHEN code='GBP' THEN 6
    ELSE 7
  END,name;
60
ответ дан 26 November 2019 в 23:23
поделиться
SELECT * FROM (VALUES ('foo'), ('bar'), ('baz'), ('egg'), ('lol')) t1(name)
ORDER BY ARRAY_POSITION(ARRAY['foo', 'baz', 'egg', 'bar'], name)

Как насчет этого? выше одной выборки как указано ниже:

foo
baz
egg
bar
lol

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

0
ответ дан 26 November 2019 в 23:23
поделиться

Вы можете сделать это ...

SELECT 
   ..., code
FROM 
   tablename
ORDER BY 
   CASE 
      WHEN code='GBP' THEN 1
      WHEN code='EUR' THEN 2
      WHEN code='BBD' THEN 3
      ELSE 4
   END

Но почему вы жестко кодируете их в запросе - разве вспомогательная таблица не будет более подходящей?

-

Править : перевернул в соответствии с комментариями

2
ответ дан 26 November 2019 в 23:23
поделиться

Обновление , конкретизирующее потрясающее предложение @Tometzky.

Это должно дать вам MySQL FIELD () -подобную функцию в pg 8.4:

-- SELECT FIELD(varnames, 'foo', 'bar', 'baz')
CREATE FUNCTION field(anyelement, VARIADIC anyarray) RETURNS numeric AS $$
  SELECT
    COALESCE(
     ( SELECT i FROM generate_subscripts($2, 1) gs(i)
       WHERE $2[i] = $1 ),
     0);
$$ LANGUAGE SQL STABLE

Mea culpa , но я не могу сейчас проверить вышесказанное на 8.4; тем не менее, я могу вернуться к «морально» эквивалентной версии, которая работает на экземпляре 8.1 передо мной:

-- SELECT FIELD(varname, ARRAY['foo', 'bar', 'baz'])
CREATE OR REPLACE FUNCTION field(anyelement, anyarray) RETURNS numeric AS $$
  SELECT
    COALESCE((SELECT i
              FROM generate_series(1, array_upper($2, 1)) gs(i)
              WHERE $2[i] = $1),
             0);
$$ LANGUAGE SQL STABLE

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

pg=> select cc.* from currency_codes cc
     left join
       (select 'GBP' as code, 0 as rank union all
        select 'EUR', 1 union all
        select 'BBD', 2 union all
        select 'AUD', 3 union all
        select 'CAD', 4 union all
        select 'USD', 5) cc_weights
     on cc.code = cc_weights.code
     order by rank desc, name asc;
 code |           name
------+---------------------------
 USD  | USA bits
 CAD  | Canadian maple tokens
 AUD  | Australian diwallarangoos
 BBD  | Barbadian tridents
 EUR  | Euro chits
 GBP  | British haypennies
(6 rows)
13
ответ дан 26 November 2019 в 23:23
поделиться

Это самый простой способ:

create temporary table test (id serial, field text);
insert into test(field) values
  ('GBP'), ('EUR'), ('BBD'), ('AUD'), ('CAD'), ('USD'),
  ('GBP'), ('EUR'), ('BBD'), ('AUD'), ('CAD'), ('USD');
select * from test
order by field!='GBP', field!='EUR', field!='BBD',
  field!='AUD', field!='CAD', field!='USD';
 id | field 
----+-------
  1 | GBP
  7 | GBP
  2 | EUR
  8 | EUR
  3 | BBD
  9 | BBD
  4 | AUD
 10 | AUD
  5 | CAD
 11 | CAD
  6 | USD
 12 | USD
(12 rows)

В PostgreSQL 8.4 вы также можете использовать функцию с переменным числом аргументов (вариативная функция) для порта поле функция.

11
ответ дан 26 November 2019 в 23:23
поделиться

Если вы будете запускать это часто, добавьте новый столбец и триггер предварительной вставки / обновления. Затем вы устанавливаете значение в новом столбце на основе этого триггера и упорядочиваете по этому полю. Вы даже можете добавить индекс в это поле.

1
ответ дан 26 November 2019 в 23:23
поделиться

На самом деле версия для postgres 8.1 - это еще одно преимущество.

При вызове функции postgres вы не можете передать ей более 100 параметров, поэтому ваше упорядочивание может быть выполнено максимум на 99 элементах.

Использование функции, использующей массив в качестве второго аргумента вместо переменного аргумента, просто снимает это ограничение.

4
ответ дан 26 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: