Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 INTERSECT  [new]
relief
Member

Откуда:
Сообщений: 1197
привет
делаю запрос

SELECT DISTINCT(CAST(i.Id COLLATE SQL_Latin1_General_CP1_CI_AS AS INT)) FROM Clients as i
INTERSECT 
SELECT DISTINCT(CAST(si.Id AS INT)) FROM Consumers as si 
  WHERE si.Id NOT LIKE 'C%'


Id - nvarchar, но в разных Collation, поэтому в первом запросе прописываю Collation от второй таблицы. в таблице Consumers есть id которые начинаются с 'C...'
когда выполняю запрос получаю сообщение

Msg 245, Level 16, State 1, Line 6
Conversion failed when converting the nvarchar value 'C9E0-00   ' to data type int.


если выполнять по отдельности оба запроса, то всё работает. Что не так?
24 май 12, 09:19    [12605599]     Ответить | Цитировать Сообщить модератору
 Re: INTERSECT  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
Что не так?

Не так то, что
converting the nvarchar value 'C9E0-00 ' to data type int.

Как вы себе представляете конвертацию 'C9E0-00 ' в int ?
24 май 12, 09:25    [12605638]     Ответить | Цитировать Сообщить модератору
 Re: INTERSECT  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
Что не так?

Не так то, что
converting the nvarchar value 'C9E0-00 ' to data type int.

Как вы себе представляете конвертацию 'C9E0-00 ' в int ?


так я же прописываю в WHERE условие
а как мне тогда по другому выполнить проверку вхождения одного строкового массива в другой?
спереди могут идти нули, поэтому надо делать конвертацию в инт
24 май 12, 09:29    [12605656]     Ответить | Цитировать Сообщить модератору
 Re: INTERSECT  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
relief
Glory
пропущено...

Не так то, что
converting the nvarchar value 'C9E0-00 ' to data type int.

Как вы себе представляете конвертацию 'C9E0-00 ' в int ?


так я же прописываю в WHERE условие
а как мне тогда по другому выполнить проверку вхождения одного строкового массива в другой?
спереди могут идти нули, поэтому надо делать конвертацию в инт


режьте строку
24 май 12, 09:33    [12605680]     Ответить | Цитировать Сообщить модератору
 Re: INTERSECT  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
Что не так?

Не так то, что
converting the nvarchar value 'C9E0-00 ' to data type int.

Как вы себе представляете конвертацию 'C9E0-00 ' в int ?


а объясните почему WHERE здесь не помогает? а если делаю отдельно запрос то поомгает?
INTERSECT работает раньше WHERE для второго запроса?

2 Winpuh

как резать?
24 май 12, 09:40    [12605727]     Ответить | Цитировать Сообщить модератору
 Re: INTERSECT  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
relief
Glory
пропущено...

Не так то, что
converting the nvarchar value 'C9E0-00 ' to data type int.

Как вы себе представляете конвертацию 'C9E0-00 ' в int ?


а объясните почему WHERE здесь не помогает? а если делаю отдельно запрос то поомгает?
INTERSECT работает раньше WHERE для второго запроса?

2 Winpuh

как резать?


вы лучше задачу знаете, ну вот так нули слева можно убрать к примеру

SELECT REPLACE(N'000000000000000000000001', N'0',N'')
24 май 12, 09:51    [12605794]     Ответить | Цитировать Сообщить модератору
 Re: INTERSECT  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
Winnipuh,
или SELECT REPLACE(N'' + Replicate('0',25) + '1', N'0',N'') , чтобы в глазах от нулей не рябило :-)
24 май 12, 09:58    [12605834]     Ответить | Цитировать Сообщить модератору
 Re: INTERSECT  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
а объясните почему WHERE здесь не помогает? а если делаю отдельно запрос то поомгает?

Потому что не обязтаельно сначала должен выполняться WHERE, потом только CONVERT
24 май 12, 10:01    [12605856]     Ответить | Цитировать Сообщить модератору
 Re: INTERSECT  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
is_me
Winnipuh,
или SELECT REPLACE(N'' + Replicate('0',25) + '1', N'0',N'') , чтобы в глазах от нулей не рябило :-)


24 май 12, 11:01    [12606317]     Ответить | Цитировать Сообщить модератору
 Re: INTERSECT  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Зачем там DISTINCT?
INTERSECT и так DISTINCT делает.
SELECT
 CAST
 (
  CASE
   WHEN ISNUMERIC(i.Id)=1
    AND i.Id NOT LIKE '%[^0-9 +-]%'
    AND LEN(REPLACE(REPLACE(REPLACE(i.Id,' ',''),'-',''),'+',''))<=10
   THEN CASE WHEN CAST(i.Id AS BIGINT) BETWEEN -2147483648 AND 2147483647 THEN i.Id END
  END AS INT
 )
FROM Clients as i
INTERSECT 
SELECT
 CAST
 (
  CASE
   WHEN ISNUMERIC(si.Id)=1
    AND si.Id NOT LIKE '%[^0-9 +-]%'
    AND LEN(REPLACE(REPLACE(REPLACE(si.Id,' ',''),'-',''),'+',''))<=10
   THEN CASE WHEN CAST(si.Id AS BIGINT) BETWEEN -2147483648 AND 2147483647 THEN si.Id END
  END AS INT
 )
FROM Consumers as si 
WHERE CAST(CASE WHEN ISNUMERIC(si.Id)=1 AND si.Id NOT LIKE '%[^0-9 +-]%' AND LEN(REPLACE(REPLACE(REPLACE(si.Id,' ',''),'-',''),'+',''))<=10 THEN si.Id END AS BIGINT) BETWEEN -2147483648 AND 2147483647;
24 май 12, 18:51    [12610344]     Ответить | Цитировать Сообщить модератору
 Re: INTERSECT  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Так немного точнее:
SELECT
 CAST
 (
  CASE
   WHEN ISNUMERIC(i.Id)=1
    AND i.Id NOT LIKE N'%[^0-9 +-]%'
    AND LEN(REPLACE(REPLACE(REPLACE(i.Id,N' ',N''),N'-',N''),N'+',N''))<=10
   THEN CASE WHEN CAST(i.Id AS BIGINT) BETWEEN -2147483648 AND 2147483647 THEN i.Id END
  END AS INT
 )
FROM Clients as i
INTERSECT 
SELECT
 CAST
 (
  CASE
   WHEN ISNUMERIC(si.Id)=1
    AND si.Id NOT LIKE N'%[^0-9 +-]%'
    AND LEN(REPLACE(REPLACE(REPLACE(si.Id,N' ',N''),N'-',N''),N'+',N''))<=10
   THEN CASE WHEN CAST(si.Id AS BIGINT) BETWEEN -2147483648 AND 2147483647 THEN si.Id END
  END AS INT
 )
FROM Consumers as si 
WHERE CAST(CASE WHEN ISNUMERIC(si.Id)=1 AND si.Id NOT LIKE N'%[^0-9 +-]%' AND LEN(REPLACE(REPLACE(REPLACE(si.Id,N' ',N''),N'-',N''),N'+',N''))<=10 THEN si.Id END AS BIGINT) BETWEEN -2147483648 AND 2147483647;
24 май 12, 18:56    [12610361]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить