- 1
SELECT a.*, ads.*, CASE ads.operation_id WHEN 1 THEN 2 WHEN 2 THEN 1 ELSE 3 END AS sort
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1
SELECT a.*, ads.*, CASE ads.operation_id WHEN 1 THEN 2 WHEN 2 THEN 1 ELSE 3 END AS sort
Когда очень надо поменять местами порядок операций
0
UPDATE `xxx` SET `updated_count` = (UPDATE `yyy` SET `zzz` = 0 WHERE `zzz` = 42)
Минимальный код в моей проблеме. Проблема в том, что UPDATE должен возвращать число изменённых строк, а MYSQL говорит, что тут ошибка. Что же мне теперь делать?
0
while exists (
select
C.CONTRAGENT_NAME,
PR.PHONE
from CONTRAGENTS C
inner join CONTRAGENT_PROPERTIES PR on PR.CONTRAGENT_ID = C.CONTRAGENT_ID
except select NAME,PHONE from IMPORT_SOURCE)
begin
declare @IDENTITIES table (CONTRAGENT_ID int)
insert CONTRAGENTS (
CONTRAGENT_NAME,
…)
output inserted.CONTRAGENT_ID into @IDENTITIES
select distinct
NAME,
…
from IMPORT_SOURCE
insert CONTRAGENT_PROPERTIES (
…,
PHONE,
…)
select
…,
S.PHONE
…
from @IDENTITIES I
inner join CONTRAGENTS C on C.CONTRAGENT_ID = I.CONTRAGENT_ID
cross apply (
select top 1
from IMPORT_SOURCE S
left join (
select
C.CONTRAGENT_NAME,
PR.PHONE
from CONTRAGENTS C
inner join CONTRAGENT_PROPERTIES PR on PR.CONTRAGENT_ID = C.CONTRAGENT_ID
) TX on TX.CONTRAGENT_NAME = S.NAME and TX.PHONE = S.PHONE
where TX.CONTRAGENT_NAME is null)
end
Импорт. В источнике за ключевые поля нужно было взять NAME и PHONE, которые в целевой базе — в разных таблицах. Курсоры — слишком долго.
0
SELECT * FROM order WHERE coalesce(cancelation_date,\'7777-07-07\'::DATE) >= :tdDate
0
if length(varrstr(cellphoneidx) != 11) or regexp_instr(varrstr(cellphoneidx), '\d\d\d\d\d\d\d\d\d\d') = 0 then
return 1;
end if;
Проверка на валидность номера телефона (с вкраплениями pl/sql):
И так везде, где требуется проверка на определенное количество цифр (номер инн, док-ов и т.д.).
Псц, товарищи.
+1
SUM(
CAST (
SUBSTRING(CAST([PercentAmount] AS VARCHAR),1, CHARINDEX ('.',[PercentAmount])-1)
+ '.'
+ SUBSTRING(CAST([PercentAmount] AS VARCHAR),CHARINDEX('.',[PercentAmount])+1, 2+CHARINDEX ('.',[PercentAmount]))
AS MONEY))
А как вы достигаете точности в 2 знака после запятой?
0
CREATE TABLE [dbo].[TBL_JOUR_PRODUCTION_PLAN_KK_BH](
[JPPKKBH_ID] [uniqueidentifier] NOT NULL,
[JPPKKBH_JPKKBH_ID] [uniqueidentifier] NOT NULL,
[JPPKKBH_WC_ID] [int] NOT NULL,
[JPPKKBH_DATE] [datetime] NOT NULL,
[JPPKKBH_QTY] [numeric](30, 5) NOT NULL,
[JPPKKBH_QTYF] [numeric](30, 5) NOT NULL,
[JPPKKBH_COMENT] [varchar](8000) NULL,
[JPPKKBH_DESCRIPTION] [varchar](8000) NOT NULL,
[JPPKKBH_WHO] [varchar](150) NOT NULL,
[JPPKKBH_WHO_ID] [uniqueidentifier] NOT NULL,
[JPPKKBH_WHEN] [datetime] NOT NULL,
(
CREATE TABLE [dbo].[TBL_JOUR_PRODUCTION_PLAN_KK_BH_HISTORY](
[JPPKKBHH_ID] [uniqueidentifier] NOT NULL,
[JPPKKBHH_JPPKKBH_ID] [uniqueidentifier] NOT NULL,
[JPPKKBHH_JPPKKBH_JPKKBH_ID] [uniqueidentifier] NOT NULL,
[JPPKKBHH_JPPKKBH_WC_ID] [int] NOT NULL,
[JPPKKBHH_JPPKKBH_DATE] [datetime] NOT NULL,
[JPPKKBHH_JPPKKBH_QTY] [numeric](30, 5) NOT NULL,
[JPPKKBHH_JPPKKBH_QTYF] [numeric](30, 5) NOT NULL,
[JPPKKBHH_JPPKKBH_COMENT] [varchar](8000) NULL,
[JPPKKBHH_JPPKKBH_DESCRIPTION] [varchar](8000) NOT NULL,
[JPPKKBHH_JPPKKBH_WHO_ID] [uniqueidentifier] NULL,
[JPPKKBHH_JPPKKBH_WHEN] [datetime] NOT NULL,
[JPPKKBHH_OPER] [int] NOT NULL,
[JPPKKBHH_WHO_ID] [uniqueidentifier] NOT NULL,
[JPPKKBHH_WHEN] [datetime] NOT NULL,
(
no comments
0
create or replace function TO_NUMBER_EX (sNumber in varchar2) return number is
---------------------------------------------------------------------
-- Преобразование строки в число с разными символами разделителями
---------------------------------------------------------------------
iRet number(12,3) :=0;
cReplSgn char(1);
cToReplSgn char(1);
begin
begin
iRet := to_number(sNumber);
exception
when OTHERS then
iRet := null;
end;
if iRet is null then
begin
if instr(sNumber,'.') > 0 then
cReplSgn := '.';
cToReplSgn := ',';
else
cReplSgn := ',';
cToReplSgn := '.';
end if;
iRet := to_number(replace(sNumber,cReplSgn,cToReplSgn));
exception
when OTHERS then
iRet := null;
end;
end if;
return(nvl(iRet,0));
end TO_NUMBER_EX;
PL/SQL
велосипедно-костыльное программирование с неожиданными значениями по умолчанию
0
function try_to_date(p_value in varchar2)
return date
is
l_date date;
l_fmt sys.odcivarchar2list := sys.odcivarchar2list('DD.MM.YYYY', 'YYYY/MM/DD', 'YYYY.MM.DD', 'dd.mm.yyyy', 'yyyy/mm/dd', 'yyyy.mm.dd');
begin
for i in 1..l_fmt.count loop
begin
l_date := to_date(p_value, l_fmt(i));
return l_date;
exception
when OTHERS then null;
end;
end loop;
return null;
end;
−1
cTemp := trim(to_char(xxx.VALUE, '999999.90'));
if substr(cTemp, 1, 1) = '.' then
sText := '0'||cTemp;
else
sText := cTemp;
end if;
PL/SQL, я блять выучил маски!