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

Откуда:
Сообщений: 265
inner join Points p on p.ID = c.Point
у меня поле c.Point варчар, а поле p.ID интежер, но мне нужно соединять из c.Point только с теми кто числовые

Сообщение было отредактировано: 14 дек 16, 13:19
10 дек 16, 09:19    [19987396]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
Pabl0
Member

Откуда:
Сообщений: 265
select *
from Points P
inner join Checks C on C.Point = P.ID


Полный запрос
10 дек 16, 09:26    [19987398]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
Pabl0
Member

Откуда:
Сообщений: 265
select *
from Points P
inner join Checks C on cast(C.Point as varchar (500)) = cast (P.ID as varchar (500))


Так?
10 дек 16, 11:11    [19987516]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
aleks2
Guest
Pabl0
select *
from Points P
inner join Checks C on cast(C.Point as varchar (500)) = cast (P.ID as varchar (500))


Так?


select *
from Points P
inner join Checks C on C.Point = cast (P.ID as varchar (500))


У тя ж C.Point и так varchar, дай хоть индексам шанс.
10 дек 16, 11:22    [19987532]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
select *
from Points P
inner join Checks C on C.Point = ltrim(str(P.ID))
10 дек 16, 19:52    [19988447]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Pabl0
но мне нужно соединять из c.Point только с теми кто числовые
isnumeric()
10 дек 16, 23:12    [19988869]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Дедушка
Pabl0
но мне нужно соединять из c.Point только с теми кто числовые
isnumeric()
если значения целые и больше нуля: not like '[^0-9]'
11 дек 16, 11:05    [19989328]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
Mr. X
Guest
Pabl0
inner join Points p on p.ID = c.Point
у меня поле c.Point варчар, а поле p.ID интежер, но мне нужно соединять из c.Point только с теми кто числовые

По мне так это бред архитектора, допустившего смешение типов в одном поле.
11 дек 16, 11:48    [19989433]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
Massa52
Member

Откуда:
Сообщений: 380
Дедушка,

При
inner join Checks C on cast(C.Point as varchar (500)) = cast (P.ID as varchar (500))

P.ID цифирь, так что isnumeric() уже масло масленное.
11 дек 16, 12:20    [19989476]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 867
Дедушка
Pabl0
но мне нужно соединять из c.Point только с теми кто числовые
isnumeric()

Не пойдет isnumeric. TRY_CAST() нужно.
12 дек 16, 15:40    [19993979]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 113
uaggster
Не пойдет isnumeric. TRY_CAST() нужно.

Почему не пойдёт? Можно же так:
select *
  from Points as P
       join Checks as C on C.Point = P.ID
 where ISNUMERIC(C.Point) = 1

но можно конечно и так:
select *
  from Points as P
       join Checks as C on TRY_CAST(C.Point AS int) = P.ID
12 дек 16, 15:43    [19994015]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 113
Но если серьёзно, то какую часть конвертить (число в строку или строку в число) нужно выбирать исходя из индексов по этим таблицам и количества записей в них. Хотя подозреваю, что это опять учебные примеры, так что в данном случае главное, чтобы вообще завелось.
12 дек 16, 15:46    [19994042]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 867
Sybex
uaggster
Не пойдет isnumeric. TRY_CAST() нужно.

Почему не пойдёт? Можно же так:
select *
  from Points as P
       join Checks as C on C.Point = P.ID
 where ISNUMERIC(C.Point) = 1



Select isnumeric(',,')

:)
Ну и много там всего :-)
12 дек 16, 15:48    [19994058]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 867
Sybex, Да, и, кстати:
select *
  from Points as P
       join Checks as C on C.Point = P.ID
 where ISNUMERIC(C.Point) = 1

Свалится в ошибку.
Потому что C.Point сначала будет приводится к int, а уже потом - проверяться на ISNUMERIC(C.Point).
12 дек 16, 15:52    [19994076]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
uaggster
Sybex, Да, и, кстати:
select *
  from Points as P
       join Checks as C on C.Point = P.ID
 where ISNUMERIC(C.Point) = 1

Свалится в ошибку.
Потому что C.Point сначала будет приводится к int, а уже потом - проверяться на ISNUMERIC(C.Point).

ой беда в голове.....
12 дек 16, 15:58    [19994120]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
uaggster
Свалится в ошибку.
Потому что C.Point сначала будет приводится к int, а уже потом - проверяться на ISNUMERIC(C.Point).
Это сервер так сказал?
12 дек 16, 16:03    [19994145]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 867
TaPaK
uaggster
Sybex, Да, и, кстати:
select *
  from Points as P
       join Checks as C on C.Point = P.ID
 where ISNUMERIC(C.Point) = 1

Свалится в ошибку.
Потому что C.Point сначала будет приводится к int, а уже потом - проверяться на ISNUMERIC(C.Point).

ой беда в голове.....

А чего не так?
Соединение производится первой операцией, фильтрация - в общем случае - потом. Если P.ID - int, то при сравнении тип C.Point будет приводиться к int.
И, соответственно, вывалится в ошибку преобразования типов на первом поле, которое нельзя привести к int.
Что не так?
12 дек 16, 16:08    [19994163]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
uaggster
TaPaK
пропущено...

ой беда в голове.....

А чего не так?
Соединение производится первой операцией, фильтрация - в общем случае - потом. Если P.ID - int, то при сравнении тип C.Point будет приводиться к int.
И, соответственно, вывалится в ошибку преобразования типов на первом поле, которое нельзя привести к int.
Что не так?
Сервер сам решает что и в каком порядке делать.
Повлиять на это практически невозможно.
12 дек 16, 16:10    [19994170]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 867
iap, согласно порядка выполнения инструкций запроса sql - фильтрация идет всяко позже соединения.
И то, что сервер может объединять эти две операции в одну - его личное дело.

Такая операция ДОЛЖНА давать ошибку.
Если не дает не всегда... Ну плохо, чо... будем с этим жить.
Только надеяться, что не даст - не нужно.

Я думаю так.
:-)
12 дек 16, 16:15    [19994208]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
uaggster
iap, согласно порядка выполнения инструкций запроса sql
Имеется в виду логический порядок выполнения запроса?
Но он не обязан совпадать с физическим. И часто не совпадает.
Устройство оптимизатора изнутри мы не знаем, поэтому невозможно определённо сказать, что он предпочтёт.
Считается, что главное, чтобы результат был тем же, что и при выполнении запроса в логическом порядке.
12 дек 16, 16:19    [19994234]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 113
uaggster
Select isnumeric(',,')

:)
Ну и много там всего :-)


Убедил! Я просто этой функцией не пользовался никогда по настоящему, так что на такие камушки подводные не налетал.

uaggster
Свалится в ошибку.
Потому что C.Point сначала будет приводится к int, а уже потом - проверяться на ISNUMERIC(C.Point).


И тем не менее такой пример у меня прекрасно работает:
use [master]

create table #T1 (id int, name sysname)
create table #T2 (id nvarchar(20), name sysname)

insert #T1
select object_id, name
  from sys.objects

insert #T2
select CAST(object_id as nvarchar(20)), name
  from sys.tables
 union all
select 'bla-bla-bla', 'bla-bla-bla'

select *
  from #T1 T1
       join #T2 T2 ON T1.id = CAST(T2.id as int)
 where ISNUMERIC(T2.id) = 1

drop table #T1
drop table #T2
12 дек 16, 16:23    [19994253]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
На самом деле числовое с символьным и не должно соединяться, но есть "очень надо", то try_cast() и try_convert() поможет.
12 дек 16, 16:29    [19994294]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
uaggster
iap, согласно порядка выполнения инструкций запроса sql - фильтрация идет всяко позже соединения.
И то, что сервер может объединять эти две операции в одну - его личное дело.

Такая операция ДОЛЖНА давать ошибку.
Если не дает не всегда... Ну плохо, чо... будем с этим жить.
Только надеяться, что не даст - не нужно.

Я думаю так.
:-)


select *
  from Points as P
       join Checks as C on C.Point = P.ID
 where ISNUMERIC(C.Point) = 1

переписать в

select *
  from Points as P
       join Checks as C on C.Point = P.ID AND  ISNUMERIC(C.Point) = 1

будет по другому?? а если ?

select *
  from Points as P
       join Checks as C on C.Point = P.ID AND  ISNUMERIC(P.ID) = 1


в каком порядке всё будет ? я не могу сказать
12 дек 16, 16:30    [19994301]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
uaggster
Такая операция ДОЛЖНА давать ошибку.
чего спорить то... берём и проверяем (смотрим план)
declare @t1 table (id int identity, p_chr nvarchar(5))
declare @t2 table (id int identity, p_int int)

insert @t1 (p_chr)
values ('1'),('A'),('1'),('B'),('C'),('1')

insert @t2 (p_int)
values (1)

select
	* 
from 
	@t1 t1 
	inner join @t2 t2 on t2.p_int = t1.p_chr 
where
	isnumeric(t1.p_chr) = 1

select
	* 
from 
	@t2 t2 
	inner join (select p_chr from @t1 where isnumeric(p_chr) = 1) t1 on t1.p_chr = t2.p_int
12 дек 16, 16:30    [19994308]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 867
iap
uaggster
iap, согласно порядка выполнения инструкций запроса sql
Имеется в виду логический порядок выполнения запроса?
Но он не обязан совпадать с физическим. И часто не совпадает.
Устройство оптимизатора изнутри мы не знаем, поэтому невозможно определённо сказать, что он предпочтёт.
Считается, что главное, чтобы результат был тем же, что и при выполнении запроса в логическом порядке.

Ага, логический.
Ведь согласно логического порядка (подчеркиваю) запрос должен завершиться с ошибкой? Преобразование 'bla-bla' к int при соединении выполнить невозможно, так ведь?
Значит должен упасть. Ну, если не падает - будем скорбеть, но писать так всё равно не будем.
select *
  from Points as P
       join Checks as C on 
       Case when ISNUMERIC(C.Point) = 1 then C.Point Else Null End = P.ID

Вот так оно логически (подчеркиваю) - будет работать правильно.
Ну, с точностью до ',,' , конечно.
12 дек 16, 16:39    [19994351]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить