• Как создать хранимую функцию, чтобы она могла вернуть разные типы?

    @galaxy
    Можно, но есть неудобство при вызове таких функций:
    CREATE OR REPLACE FUNCTION public.foo(str character varying)
     RETURNS SETOF record
     LANGUAGE plpgsql
    AS $$
    BEGIN
      IF str = 'i' THEN
       RETURN QUERY SELECT i, i*i FROM generate_series(1, 10) i;
      ELSE
        RETURN QUERY SELECT i, SQRT(i::float) FROM generate_series(1, 10) i;
      END IF;
    END;
    $$
    
    # select * from foo('i') as (key int, value int);
     key | value
    -----+-------
       1 |     1
       2 |     4
       3 |     9
       4 |    16
       5 |    25
       6 |    36
       7 |    49
       8 |    64
       9 |    81
      10 |   100
    (10 rows)
    
    # select * from foo('x') as (key int, value float);
     key |       value
    -----+--------------------
       1 |                  1
       2 | 1.4142135623730951
       3 | 1.7320508075688772
       4 |                  2
       5 |   2.23606797749979
       6 |  2.449489742783178
       7 | 2.6457513110645907
       8 | 2.8284271247461903
       9 |                  3
      10 | 3.1622776601683795
    (10 rows)
    Ответ написан
    Комментировать
  • Где ошибка в EXECUTE FORMAT?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE OR REPLACE FUNCTION _Foo2(st TIMESTAMP, fin TIMESTAMP)
    RETURNS TABLE (out_key INTEGER, out_tst timestamptz, out_val FLOAT) AS $$
    DECLARE  
      
    BEGIN
    
      RETURN QUERY EXECUTE FORMAT('
      SELECT %I, %I, %I
      FROM %I 
      WHERE %I BETWEEN ''%s'' AND ''%s'';
      ', 
      'in_key', 'in_tst', 'in_val', 'in_table', 'in_tst', st, fin);
    
    END;
    
    $$ LANGUAGE plpgsql;


    DEMO fiddle

    Ошибки найдёте самостоятельно...
    Ответ написан
    1 комментарий
  • Как вернуть временную таблицу из гипертаблицы?

    @galaxy
    Да как обычно, не думаю, что в TimescaleDB что-то отличается:
    CREATE OR REPLACE FUNCTION Foo(st TIMESTAMP, fin TIMESTAMP)
    RETURNS TABLE (tstamp timestamptz, val float) AS $$
    ...
    RETURN QUERY SELECT tstamp, val FROM hyptab WHERE tstamp >= st AND tstamp < fin;
    END;
    $$ LANGUAGE plpgsql;
    Ответ написан
    Комментировать
  • Как исправить файл стиля xsl?

    @alexalexes
    Сложно сделать first- или last- специфичный выходной элемент, так как нельзя внятно получить значение position.
    Однако, можно воспользоваться таким костылем:
    1) Вывести запятую и перенос строки впереди очередного элемента VALUES, сохранив перенос после элемента.
    2) Закомментировать лишнюю запятую в запросе.
    То есть добиться такого вывода:
    INSERT INTO table (config, allowance, tablename) VALUES --,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Ph'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Ph'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc1'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc1'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc12'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc12'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc2'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc2'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''An'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''An'']/Voltage', 3, 'number_actual')
    ;

    Правило:
    INSERT INTO table (config, allowance, tablename) VALUES --</xsl:text><xsl:apply-templates/>
        <xsl:text>;</xsl:text>
      </xsl:template>
      
      <xsl:template match="node()[@format]">
        <xsl:variable name="allowance" select="Allowance/@value"/>
       <xsl:text>,&#10;</xsl:text> <!-- Сюда добавлены запятая и перенос -->    
    <xsl:value-of select="concat('(', $apostrophe)"/>
        <xsl:for-each select="ancestor::*">
          <xsl:variable name="element" select="local-name()"/>
          <xsl:value-of select="$element"/>
          <xsl:if test="$element='Item'">
            <xsl:value-of select="concat('[@key=', $apostrophe, $apostrophe, @key, $apostrophe, $apostrophe, ']')"/>
          </xsl:if>
          <xsl:text>/</xsl:text>
        </xsl:for-each>
        <xsl:choose>
          <xsl:when test="starts-with(@format, 'N')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'number_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:when test="starts-with(@format, 'F')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'float_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:when test="starts-with(@format, 'D')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'decimal_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'string_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:otherwise>
        </xsl:choose>
        <xsl:text>&#10;</xsl:text>
      </xsl:template>
      <xsl:template match="text()"/>
    </xsl:stylesheet>
    Ответ написан
    Комментировать
  • Как вставить 300 строк в таблицу?

    @galaxy
    Проще все же key было сделать serial.

    insert into table_Number (key, tstamp)
    select * from (
    	select row_number() over () n, t
      	  from generate_series(NOW() - INTERVAL '90 days', NOW(),'1 min') t
      ) sq
     where n <= 300

    https://www.db-fiddle.com/f/bzE1G4cQ8S6sCHHPFH64gx/0
    Ответ написан
    Комментировать
  • Как создать рекурсивный запрос SQL Oracle?

    @PetrGudym
    Добрый день, elijah eliasum!

    Вы все правильно двигаетесь, только в обратную сторону, начиная с листьев.
    Воспользуйтесь системными полями sys_connect_by_path, sys_connect_by_root
    и после аналитическими функциями Оракла sum() over(), row_number() over()

    примерно так:

    select *
      from (
           select sum(quantity) over (partition by path_) quantity,
                  row_number() over (partition by path_) rn
    	          --,h.*, p.*, r.*
            from (
                  SELECT cid, par_cid, rname, 
                         sys_connect_by_path(cid,'/') path_,
    	                 sys_connect_by_root(cid)     product_cid
                    FROM catalog
                   START WITH cid in (
    		            -- возможно есть способ определить листья 
    			        -- без использования дополнительного вызова 
    		           select distinct rcid from products
    		           ) 
                  CONNECT BY PRIOR par_cid = cid
           ) h 
           join products p on (h.product_cid = p.rcid)
           join records r ...
        )
    where rn = 1
    Ответ написан
    Комментировать
  • Есть ли ошибка в запросе?

    rozhnev
    @rozhnev Куратор тега SQL
    Fullstack programmer, DBA, медленно, дорого
    Добавь скобки:
    sum((case when incoming = '1' then 1 else -1 end) * rec.quantity) balance
    Ответ написан
    Комментировать
  • String - это класс или класс-объект?

    Chronicler
    @Chronicler
    Программист
    Статические методы -- те что могут вызываться по имени класса. Class.AnyStaticMethod(). Они могут использовать только статические поля. Конечно терминологически это не верно, но смысл вы уловили верно, в этом случае сам класс выступает как объект.
    Ответ написан
    Комментировать
  • Как определить переменную среды Environment?

    @Griglapidus
    C++/Qt
    что бы задать переменную в пределах текущей сессии терминала:
    set MXUPDATE_PATH=C:\project\MxUpdate\
    что бы задать переменную на совсем:
    setx MXUPDATE_PATH C:\project\MxUpdate\
    Ответ написан
    3 комментария
  • Правильна ли реализация АПИ: new Car().Run(100)?

    Я бы переписал этот код так:
    public abstract class Transport {
        public int MaxSpeed { get; private set; }
    
        public Transport(int maxSpeed) {
            MaxSpeed = maxSpeed;
        }
    
        public string Run(int speed)
            => $"Скорость движения транспорта {(speed <= MaxSpeed ? "в пределах нормы" : "выше максимальной")}";
    }
    
    public class Car : Transport {
        public Car() : base(300) {}
    }
    
    public class Bike : Transport {
        public Bike() : base(40) {}
    }
    Ответ написан
    Комментировать
  • Как найти самое часто используемое слово в тексте?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    var text = "test the text test on test platform";
    var words = text.Split(' ');
    var stat = words.Distinct().ToDictionary(word => word, word => words.Count(x => x == word));
    foreach (var (key, value) in stat) Debug.WriteLine($"Word: {key} count: {value}");
    Ответ написан
  • Почему при первой итерации цикла for при создании нового потока не заходит в метод Count?

    Зачем? Он заходит в него в myThread.Start();
    Ответ написан
    Комментировать
  • Как сформировать новую таблицу одним запросом?

    tsklab
    @tsklab Куратор тега Transact-SQL
    Здесь отвечаю на вопросы.
    DECLARE @T TABLE ( M DATETIME2(0))
    INSERT @T VALUES ('2017-02-01 15:00:43'), 
    ('2017-03-18 10:30:10'),
    ('2017-12-11 01:21:55'),
    ('2017-12-11 15:33:03'),
    ('2017-03-18 10:30:10'),
    ('2017-02-22 08:40:42'),
    ('2017-06-06 23:59:40')
    
    SELECT DISTINCT MB.M AS [Start],
      ( SELECT TOP 1 M FROM @T AS ME WHERE (ME.M > MB.M) ORDER BY ME.M ) AS [End]
      FROM @T AS MB
    UNION
    SELECT M, M
      FROM @T
      GROUP BY M
      HAVING COUNT(M) > 1
    ORDER BY 1, 2
    Ответ написан
    1 комментарий
  • Как переделать запрос из t-sql в oracle sql?

    @MaximaXXl
    А в чем проблемма?
    select s.Name
         , sum(nvl(o.Amount, 0)) as Quantity
      from Sellers as s,
              Orders as o
     where s.id = o.Salesperson_id 
       and o.Order_date is not null 
       and o.Order_date > to_date('20091231','YYYYMMDD') /*если это date*/
     group by s.id, s.Name
    having count(o.Salesperson_id) > 1
     order by sum(nvl(o.Amount, 0)) desc
    offset 0 rows fetch next 1 rows only


    убрал inner join т.к. на Orders as o накладывается ограничения в where
    а так должно работать
    Можно и это добавлять
    , row_number() over(partition by s.id order by null) но это не гарантирует порядок сортировки, посему можно его опускать
    Ответ написан
    Комментировать
  • Поможете написать два запроса Inner Join?

    tumbler
    @tumbler
    бекенд-разработчик на python
    INNER JOIN используется там, где правая и левая части обязательно должны найти друг друга. LEFT OUTER JOIN там, где правой половинки может не быть. Тогда в соответствующих столбцах везде будет стоять NULL.

    В первом задании у продавца может не быть заказов после 2010 года, но такие продавцы и не нужны в ответе. Так что INNER. Во втором у всех продавцов может вообще не быть продаж, но выводить их всех всё равно надо. LEFT.
    Ответ написан
    Комментировать
  • Как обновить несколько строк одним запросом MS SQL?

    tsklab
    @tsklab Куратор тега Transact-SQL
    Здесь отвечаю на вопросы.
    UPDATE Markers
    SET Lat = CASE ID WHEN 1 THEN '1' WHEN 2 THEN '3' END,
        Lng = CASE ID WHEN 1 THEN '2' WHEN 2 THEN '4' END
    WHERE ID IN (1, 2)
    Ответ написан
    1 комментарий
  • Где найти OID для для модели картриджа и даты выпуска принтера?

    @dude2012
    Вот еще известные оиды для принтеров:

    1.3.6.1.2.1.43.11.1.1.8.1.x - Max Toner Level
    1.3.6.1.2.1.43.11.1.1.9.1.x - Current Toner Level
    (можно высчитать процент остатка)

    1.3.6.1.2.1.43.11.1.1.6 - таблица имён картриджей. Как раз оттуда
    можно взять x, чтобы поставить в нужный OID выше для получения остатка
    чернил в каждом из них (если их больше одного).

    Дата выпуска иногда в OID описания бывает. Отдельно не встречал.
    Ответ написан
    Комментировать
  • Толковый видеоурок по Chrome Developer Tools?

    @yurahne
    Отличное видео.
    https://youtu.be/3sV9yMhqAgk
    Ответ написан
    Комментировать
  • Десериализация json в C# с помощью Newtonsoft.Json.dll?

    Kubatai
    @Kubatai
    Техник-программист
    Опишите некий класс Answer(произвольное название), в котором будут хранится свойства с такими же именами и типами, как в вашем json, и при десериализации ссылайтесь на этот класс вот так:
    Answer answer= JsonConvert.DeserializeObject<Answer>(iJson);

    Для быстрого преобразования json-данных в классы c# можно воспользоваться данным онлайн-сервисом:
    json2csharp.com

    Описания классов json от сервиса выше
    // To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
    //
    //    using QuickType;
    //
    //    var data = GettingStarted.FromJson(jsonString);
    //
    // For POCOs visit quicktype.io?poco
    //
    namespace QuickType
    {
        using System;
        using System.Net;
        using System.Collections.Generic;
    
        using Newtonsoft.Json;
    
        public partial class GettingStarted
        {
            [JsonProperty("measures")]
            public Measures Measures { get; set; }
    
            [JsonProperty("number2")]
            public Number2 Number2 { get; set; }
    
            [JsonProperty("items")]
            public Items Items { get; set; }
    
            [JsonProperty("number1")]
            public Number1 Number1 { get; set; }
    
            [JsonProperty("user")]
            public User User { get; set; }
        }
    
        public partial class Measures
        {
            [JsonProperty("2")]
            public OtherThe1 The2 { get; set; }
    
            [JsonProperty("1")]
            public OtherThe1 The1 { get; set; }
    
            [JsonProperty("3")]
            public OtherThe1 The3 { get; set; }
        }
    
        public partial class OtherThe1
        {
            [JsonProperty("name")]
            public string Name { get; set; }
    
            [JsonProperty("title")]
            public string Title { get; set; }
        }
    
        public partial class Number2
        {
            [JsonProperty("2")]
            public OtherOtherOtherThe1 The2 { get; set; }
    
            [JsonProperty("1")]
            public OtherOtherOtherThe1 The1 { get; set; }
    
            [JsonProperty("3")]
            public OtherOtherOtherThe1 The3 { get; set; }
        }
    
        public partial class OtherOtherOtherThe1
        {
            [JsonProperty("name")]
            public string Name { get; set; }
    
            [JsonProperty("description")]
            public string Description { get; set; }
    
            [JsonProperty("parent")]
            public string Parent { get; set; }
    
            [JsonProperty("title")]
            public string Title { get; set; }
        }
    
        public partial class Items
        {
            [JsonProperty("2")]
            public The1 The2 { get; set; }
    
            [JsonProperty("1")]
            public The1 The1 { get; set; }
    
            [JsonProperty("3")]
            public The1 The3 { get; set; }
        }
    
        public partial class The1
        {
            [JsonProperty("measure")]
            public string Measure { get; set; }
    
            [JsonProperty("number")]
            public string Number { get; set; }
    
            [JsonProperty("foxproID")]
            public string FoxproID { get; set; }
    
            [JsonProperty("name")]
            public string Name { get; set; }
    
            [JsonProperty("producer")]
            public string Producer { get; set; }
    
            [JsonProperty("suodID")]
            public string SuodID { get; set; }
        }
    
        public partial class Number1
        {
            [JsonProperty("2")]
            public OtherOtherThe1 The2 { get; set; }
    
            [JsonProperty("1")]
            public OtherOtherThe1 The1 { get; set; }
    
            [JsonProperty("3")]
            public OtherOtherThe1 The3 { get; set; }
        }
    
        public partial class OtherOtherThe1
        {
            [JsonProperty("description")]
            public string Description { get; set; }
    
            [JsonProperty("name")]
            public string Name { get; set; }
        }
    
        public partial class User
        {
            [JsonProperty("login")]
            public string Login { get; set; }
    
            [JsonProperty("ip")]
            public string Ip { get; set; }
    
            [JsonProperty("number")]
            public long Number { get; set; }
        }
    
    
        public partial class GettingStarted
        {
            public static GettingStarted FromJson(string json) => JsonConvert.DeserializeObject<GettingStarted>(json, Converter.Settings);
        }
    
        public static class Serialize
        {
            public static string ToJson(this GettingStarted self) => JsonConvert.SerializeObject(self, Converter.Settings);
        }
    
        public class Converter
        {
            public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
            {
                MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
                DateParseHandling = DateParseHandling.None,
            };
        }
    }
    Ответ написан
    Комментировать