селект с проверкой года

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
2hands
Сообщения: 21
Зарегистрирован: 06 дек 2005, 14:42

селект с проверкой года

Сообщение 2hands » 16 июн 2009, 11:37

Доброго времени суток!
подскажите как составить select.

есть таблица, одна из колонок (например, yy1) varchar(4) должна содержать год.
но есть и другая информация. Как выбрать записи из таблицы , в которых yy1 содержит информацию, отличную от года.
Спасибо

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: селект с проверкой года

Сообщение WildSery » 16 июн 2009, 11:42

Так и определись, как различить.
Мы-то откуда догадаемся? "2000" - это год или вес машины в килограммах?

2hands
Сообщения: 21
Зарегистрирован: 06 дек 2005, 14:42

Re: селект с проверкой года

Сообщение 2hands » 16 июн 2009, 11:59

WildSery писал(а):Так и определись, как различить.
Мы-то откуда догадаемся? "2000" - это год или вес машины в килограммах?
Это я дальше в программе определяю.
А здесь нужно выбрать записи, у которых
4 цифры в yy1

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: селект с проверкой года

Сообщение WildSery » 16 июн 2009, 12:48

2hands писал(а):А здесь нужно выбрать записи, у которых 4 цифры в yy1
Вот, уже половина задачи решена. Попутно наводящий вопрос - "0000" или "9999" - это тоже год?

2hands
Сообщения: 21
Зарегистрирован: 06 дек 2005, 14:42

Re: селект с проверкой года

Сообщение 2hands » 16 июн 2009, 13:08

WildSery писал(а):
2hands писал(а):А здесь нужно выбрать записи, у которых 4 цифры в yy1
Вот, уже половина задачи решена. Попутно наводящий вопрос - "0000" или "9999" - это тоже год?
это я проверю программно. главное, чтобы выбирались записи, у которых в этом поле не цифры.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: селект с проверкой года

Сообщение kdv » 16 июн 2009, 13:56

у которых в этом поле не цифры.
udf типа isDigit.

2hands
Сообщения: 21
Зарегистрирован: 06 дек 2005, 14:42

Re: селект с проверкой года

Сообщение 2hands » 16 июн 2009, 14:19

я то думал мне сейчас выложат
select * from ..... where ....
буду пробовать и читать
спасибо

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: селект с проверкой года

Сообщение WildSery » 16 июн 2009, 16:14

Никто думать не хочет. Все хотят готового :(

Код: Выделить всё

select * from T where yy1 not between '0000' and '9999'
И хотя это подходит только для четырёх цифр, но ведь ты так и не озвучил, что за помойка в этом полу, и какие "года" там могут быть.

2hands
Сообщения: 21
Зарегистрирован: 06 дек 2005, 14:42

Re: селект с проверкой года

Сообщение 2hands » 16 июн 2009, 16:37

все как всегда на стыке модулей разных пользователей.
в одном поле для даты, куда заносится ручками дата.
Но. в соответствии с установками системы, там может быть и "18-3-2001" и "03111999" и куча других вариантов.
А при добавлении в varchar(4) записываются последние символа. ПОэтому там могут быть и разделители (точка, пробел, слэш и пр.)
Поэтому нужно найти такие записи с "ошибками" .
вот и вся помойка.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: селект с проверкой года

Сообщение Dimitry Sibiryakov » 16 июн 2009, 19:14

Код: Выделить всё

select * from T where yy1 containig '.' or yy1 containing '-' or yy1 containing ' ' or yy1 containing '/'

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: селект с проверкой года

Сообщение WildSery » 16 июн 2009, 21:27

Код: Выделить всё

...or yy1 containing 'a' or yy1 containing 'b' or yy1 containing ...
:D

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: селект с проверкой года

Сообщение kdv » 16 июн 2009, 22:32

я то думал мне сейчас выложат
в SQL проверки строки на "цифра-не цифра" нет, или по крайней мере в FB/IB нет. Поэтому самое простое решение - where isDigit(field) = 1. Дальше уже можно проверять, что это за цифра такая. Но с учетом того, что в этой varchar(4) может быть все что угодно, в том числе и 00, и 0, и 999, что я бы годом не считал, то на мой взгляд проще всего не морочить голову пытаясь навернуть SQL, а сделать все нужные проверки на клиенте. Считал запись, проверил, выдал результат. Все равно придется все записи перебирать.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: селект с проверкой года

Сообщение Dimitry Sibiryakov » 17 июн 2009, 13:31

WildSery писал(а):

Код: Выделить всё

...or yy1 containing 'a' or yy1 containing 'b' or yy1 containing ...
:D
И в каких же региональных настройках ты видел a или b в качестве разделителя?.. :?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: селект с проверкой года

Сообщение WildSery » 17 июн 2009, 14:04

Dimitry Sibiryakov писал(а):И в каких же региональных настройках ты видел a или b в качестве разделителя?.. :?
При чём тут разделитель? Автор сказал "заносится ручками".

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Re: селект с проверкой года

Сообщение Tonal » 24 июн 2009, 09:08

2hands писал(а): в одном поле для даты, куда заносится ручками дата.
Но. в соответствии с установками системы, там может быть и "18-3-2001" и "03111999" и куча других вариантов.
А при добавлении в varchar(4) записываются последние символа. ПОэтому там могут быть и разделители (точка, пробел, слэш и пр.)
Поэтому нужно найти такие записи с "ошибками" .
Не проще ли валидировать данные на клиенде перед тем как что-то в базу писать?
Тогда и помойки не будет.
Ну и для даты применять не varchar(20) а date? :)

Ответить