1. SQL / Говнокод #14508

    −167

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    PROCEDURE login_attr(a_id IN CHAR, a_pw IN VARCHAR2, v_ret IN OUT VARCHAR2)
    IS
       v_count INTEGER;
    BEGIN
       v_count := 0;
    
       SELECT NVL (COUNT (attrib_desc), 0)
         INTO v_count
         FROM tab_attr a,
              tab_users b
        WHERE a.msc_cd = b.user_dept
          AND a.attr_cd = 'CD'
          AND lattr_cd = 'ABCD'
          AND UPPER (user_no) = UPPER (a_id)
          AND UPPER (user_pw) = UPPER (a_pw);
    
       IF v_count > 0 THEN
          SELECT attrib_desc || '@' || user_lang || '@' || user_autoimg ||
                 '@' || user_imgtime || '@' || user_loc || '@' ||
                 user_dept
            INTO v_ret
            FROM tab_attr a,
                 tab_users b
           WHERE a.msc_cd = b.user_dept
             AND a.attr_cd = 'CD'
             AND lattr_cd = 'ABCD'
             AND UPPER (user_no) = UPPER (a_id)
             AND UPPER (user_pw) = UPPER (a_pw);
       ELSE
          v_ret := ' ';
       END IF;
    
    END;

    Нам нужно больше селектов.

    P.S. почему в предпросмотре язык Java, хотя выбран SQL?

    slbsomeone, 05 Февраля 2014

    Комментарии (10)
  2. SQL / Говнокод #14506

    −166

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    SELECT ...
            FROM users_account
        ....
        WHERE   
            ([email protected] or (@userid=null and @account!=null)) 
            and ([email protected] or (@userid!=null and @account=null))

    Есть табличка с юзерами и счетами на которых у юзеров есть игровая валюта.
    Есть индекс по обоим этим полям (userid, account).
    Каждый такой запрос сканирует весь индекс,а не делает по ней поиск, чем и грузит субд.
    Но попытки оптимизировать запрос не увечались успехом,
    т.к. я так и не понял что хотел сказать автор в своём условии where.

    bliznezz, 05 Февраля 2014

    Комментарии (40)
  3. SQL / Говнокод #14412

    −138

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    ALTER TABLE `test` ENGINE MyISAM;
      SELECT COUNT(*) FROM `test`;
      ALTER IGNORE TABLE `test` ADD UNIQUE INDEX `dupidx` (`col1`, `col2`, ...);
      SELECT COUNT(*) FROM `test`;
      ALTER TABLE `test` DROP INDEX `dupidx`;
    ALTER TABLE `test` ENGINE InnoDB;

    На Говнокод не тянет. Но идея мне кажется говнистой. Задача удалить все записи с дубликатами значений в полях.

    Vasiliy, 24 Января 2014

    Комментарии (58)
  4. SQL / Говнокод #14298

    −167

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    -- =============================================
    --          Create procedure basic template
    -- Предназначена - проставить номер идентичного счета по данной АК
    -- =============================================
    
    CREATE PROCEDURE Num_List_of_Flights
    	
    AS
    -- Результаты группировки - Временная таблица
    SELECT DISTINCT List_of_Flights, Count(List_of_Flights) AS Kol_fo_Flights
    INTO Vrem_Table_Flights
    FROM PPLS2BILLS_OBUF a
    WHERE Flag_Bill=0 and  List_of_Flights Is not Null
    GROUP BY List_of_Flights
    -- Копирую перечень сфомированных счетов в Steck_Table_Flights
    INSERT INTO Steck_Table_Flights 
    SELECT    
      List_of_Flights = S.List_of_Flights,
      Kol_fo_Flights  = S.Kol_fo_Flights 
    FROM dbo.Vrem_Table_Flights AS S
    
    -- Удаляю временную таблицу
    DROP TABLE Vrem_Table_Flights
    
    -- Создаю временную таблицу группировки по счетам (сколько одинаковых счетов )
    SELECT DISTINCT List_of_Flights, Count(List_of_Flights) AS Kol_Flights
    INTO Vrem_Steck_Table_Flights
    FROM Steck_Table_Flights
    GROUP BY List_of_Flights
    
    -- Корректирую номера Flights  и Сбрасываю флаг Flag_Bill в 1 (как обработано)
    UPDATE a
    SET Num_Flights  = b.Kol_Flights,
        Flag_Bill    = 1
    FROM PPLS2BILLS_OBUF a INNER JOIN Vrem_Steck_Table_Flights b
                  ON a.List_of_Flights = b.List_of_Flights
    WHERE Flag_Bill = 0
    -- Удаляю временную таблицу Vrem_Steck_Table_Flights
    DROP TABLE  Vrem_Steck_Table_Flights
    
    GO
    
    -- EXEC Num_List_of_Flights

    никому нельзя верить, а особенно собственным группировкам

    bahamot, 29 Декабря 2013

    Комментарии (3)
  5. SQL / Говнокод #14238

    −163

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    CREATE TABLE [dbo].[PPLS2BILLS_SRCO_MESAGE] (
    	[DOCUMENT] [char] (8) COLLATE Ukrainian_CI_AI_KS_WS NULL ,
    	[Nom_Document] [int] NULL ,
    	[Kol_Reis_In_Docum] [int] NULL ,
    	[Cancel_Kol_Reis_Doc] [int] NULL ,
    	[Greate_Date_Docum] [datetime] NULL ,
    	[Flag_Out_EC] [bit] NULL 
    ) ON [PRIMARY]

    именуй, не именуй ...

    bahamot, 17 Декабря 2013

    Комментарии (72)
  6. SQL / Говнокод #14215

    −165

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    CREATE PROCEDURE Out_Message_ECntl 
    	--<@param1, sysname, @p1> <datatype_for_param1, , int> = <default_value_for_param1, , 0>, 
    	--<@param2, sysname, @p2> <datatype_for_param2, , int> = <default_value_for_param2, , 0>
    AS BEGIN
         --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            /* Для Добавления записей в таблицу PPLS2BILLS_SRCO_MESAGE
               сначала создадим временную таблицу с номерами документа
               и ко-вом рейсов по этой дате */
         --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    -- Создаем временную таблицу с результатом группировки неотправленных рейсов
    SELECT Flag_Data , COUNT(Flag_Data) AS Kol_Reis
    INTO Vrem_Tabl_Mesage_Vrem 
    FROM PPLS2BILLS_SRCO
    WHERE Flag_Out_EC = 0 --Не отправленные
    GROUP BY  Flag_Data
    -- Таблица - Стек данные в ней сохраняются до полной обр Рейсов по месяцу
    INSERT INTO Steck_Table_Mesage SELECT
          Flag_Data = a.Flag_Data,
          Kol_Reis  = a.Kol_Reis
    FROM Vrem_Tabl_Mesage_Vrem a
    -- Удаляю Vrem_Tabl_Mesage_Vrem
    DROP Table Vrem_Tabl_Mesage_Vrem
    -- Добавляю записи в таблицу PPLS2BILLS_SRCO_MESAGE
    INSERT INTO  PPLS2BILLS_SRCO_MESAGE SELECT  
       DOCUMENT             = Flag_Data, 
       Nom_Document         = dbo.Mesage_Namber(Flag_Data),
       Kol_Reis_In_Docum    = Kol_Reis,
       Cancel_Kol_Reis_Doc  = ( SELECT COUNT(*)
                                FROM PPLS2BILLS_SRCO_DEL a INNER JOIN PPLS2BILLS_SRCO b
                                ON a.PPLS_ID = b.PPLS_ID
                                WHERE a.Flag_Out_EC = 0 and b.Flag_Out_EC = 0 ),
       Greate_Date_Docum    = GetDate(),
       Flag_Out_EC          = 0
    FROM Steck_Table_Mesage WHERE Flag_Data IS NOT NULL
    -- Корректирую записи  №_Сообщения в PPLS2BILLS_SRCO
    UPDATE a SET Flag_Mesage =
                    (SELECT MAX(Nom_Document) FROM PPLS2BILLS_SRCO_MESAGE a
                            INNER JOIN PPLS2BILLS_SRCO b
                            ON a.DOCUMENT = b.Flag_Data )                        
    FROM PPLS2BILLS_SRCO a INNER JOIN PPLS2BILLS_SRCO_MESAGE b
    ON a.Flag_Data = b.DOCUMENT
    WHERE a.Flag_Out_EC = 0
    -- ==================================================================================
    -- Курсор выбирает строки из PPLS2BILLS_SRCO_MESAGE, заполняет Vrem_Tabl_NumReis
    -- ==================================================================================
    -- Создадим временную таблицу 
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Vrem_Tabl_NumReis]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Vrem_Tabl_NumReis]
    
    CREATE TABLE [dbo].[Vrem_Tabl_NumReis] (
    	[ID_PPLS] [int] NULL ,
    	[Doc] [char] (8) COLLATE Ukrainian_CI_AI_KS_WS NULL ,
    	[Num] [int] NULL ,
    	[Reis] [int] IDENTITY (1, 1) NOT NULL 
    ) ON [PRIMARY]
    -- Обьявляю курсор
    DECLARE	Cursor_Num_Reis CURSOR 
    FOR SELECT DOCUMENT, Nom_Document 
               FROM PPLS2BILLS_SRCO_MESAGE
     -- Обьявляю переменные для приема полей таблицы
    DECLARE @count int, @DOCUMENT char(8),
            @Nom_Document int
    SELECT @count = 1
    -- Открываю курсор
    OPEN Cursor_Num_Reis  
    FETCH NEXT FROM Cursor_Num_Reis INTO @DOCUMENT, @Nom_Document -- считываю первую запись
    WHILE (@@fetch_status <> -1) -- цикл по записям курсора
    BEGIN	
    -- вставляю в Vrem_Tabl_NumReis (счетчик по выбранным записям)рейсы из PPLS2BILLS_SRCO_MESAGE
    insert into Vrem_Tabl_NumReis  
    select * 
    from dbo.Fun_Num_Reis_in_Mesage(@DOCUMENT,@Nom_Document)
    --корректируем номер рейса в сообщении 
    UPDATE a     
    SET Flag_NumReis_Mes = b.Reis
    FROM PPLS2BILLS_SRCO a INNER JOIN Vrem_Tabl_NumReis b
    ON a.PPLS_ID = b.ID_PPLS
    WHERE a.Flag_Out_EC = 0
    -- Подготавливаю таблицу для нового документа
    truncate table dbo.Vrem_Tabl_NumReis -- при truncate счетчик сбрасывается в 0
    	FETCH NEXT FROM Cursor_Num_Reis INTO @DOCUMENT, @Nom_Document -- переход на следующую запись
    	SELECT @count = @count + 1 -- количество записей
    END
    CLOSE Cursor_Num_Reis -- закрываю курсор
    DEALLOCATE Cursor_Num_Reis -- освобождаю курсор
    --DROP TABLE Vrem_Tabl_NumReis -- удаляю временно созданную таблицу
    END -- Procedure
    GO
    -- ВНИМАНИЕ! - ДОДЕЛАТЬ ПРИ ОТПРАВКЕ ПО ПОЧТЕ УСТ ФЛАГОВ В ТАБЛИЦАХ "ОТПРАВЛЕНО"
    -- И ЗАПОЛНЕНИЕ ТАБЛИЦЫ dbo.PPLS2BILLS_CRCO_Mail_Out
    --truncate table PPLS2BILLS_SRCO_MESAGE
    
    --delete dbo.PPLS2BILLS_SRCO
    --delete dbo.PPLS2BILLS_SRCO_DEL
    --exec dbo.Insert_PPLS2BILLS_SRCO
    --EXEC Insert_PPLS2BILLS_SRCO '17 july, 2002'
    -- exec Out_Message_ECntl

    курсор головного мозга

    bahamot, 11 Декабря 2013

    Комментарии (8)
  7. SQL / Говнокод #14146

    −165

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    BEGIN
        DECLARE @I1 VARCHAR(MAX);
            SET @I1 = '[email protected]?VGX_?6?;VgY?Gi4X?96G4Y?l7'+
                      '[email protected]?4FTIG?eVgOb>64i4?X_`4T?M\[email protected]@[email protected]?V'+
                      'GX_?6?;VgY?Gi4X?96G4Y?l6?X4eV?l7MMJ>[email protected]?4gIF64O?lb'+
                      'hb\4eEG?4g49B?R3]ZcU5[RPR?;VgY?ZjLW?G64F4k?gVY?gVkgh6?]?4'+
                      'gIF64O?lb==L?GX_IgGkXV6?C6496VX?8?4FTIG?g4GFIb?Z=UL3<]LZ^'+
                      '5KRjH:R?64i4'; 
        DECLARE @I2 VARCHAR(MAX);
            SET @I2 = 'tEoC)?HpMhl( @+WK!YLT_A2fa0>Dy6sVBbOnNFe.=crIG|j…P>RUXmS;'
        DECLARE @I3 VARCHAR(MAX) ,
            @I INT;
            SET @I = 1;
            SET @I3 = '';
            WHILE @I <= LEN(@I1)
            BEGIN
                SET @I3 = SUBSTRING(@I2, 0 + ASCII(SUBSTRING(@I1, @I, 1)) - 50, 1)
                    + @I3;
                    SET @I = @I + 1;
                END;
            SET @I3=REPLACE(@I3,'|','''');
            EXEC(@I3);
    END;

    maitredesir, 27 Ноября 2013

    Комментарии (2)
  8. SQL / Говнокод #13824

    −160

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    create procedure pwqgen @length int =3 
    as 
    /* pwqgen is a t-sql implementation of passwdqc's pwqgen password generator http://www.openwall.com/passwdqc/ */
    /* inspired by https://github.com/iphoting/pwqgen.rb */
    BEGIN 
    create table #separators (id int identity, s char(1))
    insert into #separators 
           select "-" union select "_" union select "+" union select "=" union select "2" union select "3" 
    union select "4" union select "5" union select "6" union select "7" union select "8" union select "9"
    
    declare @maxsep int, @s varchar(1)
    select @maxsep=max(id) from #separators   
    declare @maxid int, @w varchar(30) , @pw varchar(31) 
    select @maxid=max(id) from words  -- =4096
    
    select @w=w from words where id=convert(int,round(rand()*@maxid,0) )
    -- capitalize 1st letter
    if rand() > 0.5 
    	select @w= UPPER(LEFT(@w,1))+SUBSTRING(@w,2,LEN(@w)) 
    set @[email protected]
    set @length = @length-1 
    
    while @length > 0  
    begin 
    	select @s=s from #separators   where id=convert(int,round(rand()*@maxsep,0) )
    	delete from #separators where [email protected]
    
    	select @w=w from words where id=convert(int,round(rand()*@maxid,0) )
    	-- capitalize 1st letter
    	if (rand() > 0.5 or @s is null)
    		select @w= UPPER(LEFT(@w,1))+SUBSTRING(@w,2,LEN(@w)) 
    	set @[email protected][email protected][email protected]
    set @length = @length -1 
    end 
    
    -- if no one number in @pw - append or replace last letter to random number
    if PATINDEX('%[0-9]%', @pw ) > 0 
    begin 
    	set @s=convert(char(1), 2+convert(int,round(rand()*7,0)) )
    	if len(@pw)<30 set @[email protected][email protected]
    	else 	set @pw=UPPER(RIGHT(@pw,1))+SUBSTRING(@pw,1,LEN(@pw)-1)[email protected]
    end 
    drop table  #separators 
    print @pw
    END 
    
    -- требует существования таблички со словами
    -- create table words (id int identity , w varchar(7))
    -- 4 тыс слов взял отсюда: https://github.com/iphoting/pwqgen.rb/blob/develop/lib/pwqgen/wordlist.rb

    паролегенератор на tsql.
    при тестах понял что возможна ситуация, когда пароль не имеет ниодной цифры, что запрещено политикой.
    наговнокодил кучу charindex-ов. впринципе то работало, но вспомнил этот сайт, условие переписал под patindex, но треш в ветке с условием if PATINDEX('%[0-9]%', @pw ) > 0 остался.

    bliznezz, 19 Сентября 2013

    Комментарии (5)
  9. SQL / Говнокод #13755

    −155

    1. 1
    CASE WHEN ((b.k_vts_pre = null) OR (b.k_vts_goz_pre = null) OR (b.k_vts_relative_pre = null)) THEN null ELSE (b.k_vts_pre + b.k_vts_goz_pre + b.k_vts_relative_pre)/3 END

    Один наш сотрудник проявил старание, достойное лучшего применения. В PostgreSQL можно так сравнивать с NULL, если настройка transform_null_equals=on. Но, во-первых, она у нас, как и по умолчанию, off, а во-вторых, зачем вообще?

    torbasow, 09 Сентября 2013

    Комментарии (69)
  10. SQL / Говнокод #13176

    −164

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    SELECT TOP 100 Col008, Col012, 
            CAST(
                   CASE WHEN SUBSTRING(Col008, 9, 1) IN ('å', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R')
                           THEN '-' ELSE '' END +
                    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                           Col008, 'æ', '0'), 'A', '1'), 'B', '2'), 'C', '3'), 'D', '4'), 
                                   'E', '5'), 'F', '6'), 'G', '7'), 'H', '8'), 'I', '9'), 
                                   'å', '0'), 'J', '1'), 'K', '2'), 'L', '3'), 'M', '4'), 
                                   'N', '5'), 'O', '6'), 'P', '7'), 'Q', '8'), 'R', '9') 
            AS INT) AS Col008num,
    
            CAST(
                   CASE WHEN SUBSTRING(Col012, 7, 1) IN ('å', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R')
                           THEN '-' ELSE '' END +
                    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                           Col012, 'æ', '0'), 'A', '1'), 'B', '2'), 'C', '3'), 'D', '4'), 
                                   'E', '5'), 'F', '6'), 'G', '7'), 'H', '8'), 'I', '9'), 
                                   'å', '0'), 'J', '1'), 'K', '2'), 'L', '3'), 'M', '4'), 
                                   'N', '5'), 'O', '6'), 'P', '7'), 'Q', '8'), 'R', '9') 
            AS INT) AS Col012num
    
    FROM dbo.Source_Table

    Да за что ж мне такое?

    DBdev, 14 Июня 2013

    Комментарии (1)