Все вышеизложенное работает ужасно с большими партиями или небольшим объемом памяти. Пришлось написать свой собственный, который будет конвейер (нигде не заметил накопления элемента):
public static class BatchLinq {
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int size) {
if (size <= 0)
throw new ArgumentOutOfRangeException("size", "Must be greater than zero.");
using (IEnumerator<T> enumerator = source.GetEnumerator())
while (enumerator.MoveNext())
yield return TakeIEnumerator(enumerator, size);
}
private static IEnumerable<T> TakeIEnumerator<T>(IEnumerator<T> source, int size) {
int i = 0;
do
yield return source.Current;
while (++i < size && source.MoveNext());
}
}
Изменить: Известная проблема с этим подходом заключается в том, что каждая партия должна быть перечислина и перечислина полностью, прежде чем перейти к следующей партии. Например, это не работает:
//Select first item of every 100 items
Batch(list, 100).Select(b => b.First())
Это должно работать в большинстве случаев.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
Он не работает для нестандартных чисел, таких как
1e4
1.2e5
123.
(конечный десятичный знак) Я обнаружил, что это работает довольно хорошо
if(col1/col1= 1,'number',col1) AS myInfo
col1 <> 0
и дает ложное положительное значение для 1a
- rextester.com/HLORBZ1242
– Paul Spiegel
5 July 2018 в 19:20
Этот ответ подобен Дмитрию, но он будет содержать десятичные и положительные и отрицательные числа.
select * from table where col1 REGEXP '^[[:digit:]]+$'
Я рекомендую: если ваш поиск прост, вы можете использовать `
column*1 = column
` operator interesting :) работает и быстрее, чем на полях varchar / char
SELECT * FROM myTable WHERE column * 1 = column;
blockquote>ABC*1 => 0 (NOT EQU **ABC**) AB15*A => 15 (NOT EQU **AB15**) 15AB => 15 (NOT EQU **15AB**) 15 => 15 (EQUALS TRUE **15**)
select 'aaa123' >= 0
и select '123aaa' >= 0
возвращают true?
– Grzegorz Smulko
15 July 2016 в 11:38
использует UDF (пользовательская функция).
CREATE FUNCTION isnumber(inputValue VARCHAR(50))
RETURNS INT
BEGIN
IF (inputValue REGEXP ('^[0-9]+$'))
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
Затем, когда вы запрашиваете
select isnumber('383XXXX')
- возвращает 0
select isnumber('38333434')
--returns 1
select isnumber (mycol) mycol1, col2, colx from tablex; - вернет 1s и 0s для столбца mycol1
- вы можете усилить функцию, чтобы принимать десятичные значения, научную нотацию и т. д. ...
Преимущество использования UDF заключается в том, что вы можете использовать его в левой или правой части вашего сравнения «where clause». это значительно упрощает ваш SQL перед отправкой в базу данных:
SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
надеюсь, что это поможет.
Все еще не хватает этой простой версии:
SELECT * FROM myTable WHERE `col1` + 0 = `col1`
(добавление должно быть быстрее как умножение)
Или самая медленная версия для дальнейшего воспроизведения:
SELECT *,
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC`
FROM `myTable`
HAVING `IS_NUMERIC` = 1
Если ваши данные являются «test», «test0», «test1111», «111test», «111»
Чтобы выбрать все записи, где данные являются простыми int:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
Результат: '111'
(В regex, ^ означает начало, а $ означает конец)
Чтобы выбрать все записи, где существует целое или десятичное число:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
Результат: '111' (то же, что и в последнем примере)
Наконец, чтобы выбрать все записи, в которых существует номер, используйте это:
SELECT *
FROM myTable
WHERE col1 REGEXP '[0-9]+';
Результат: «test0» и «test1111» и «111test» и «111»
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
– Nicolas
15 December 2015 в 11:49
Это решает все ваши проблемы? так как строки не будут вычисляться так же, как цифры ...
SELECT * FROM myTable WHERE sign (col1)!=0
знак окончания (0) равен нулю, но тогда вы можете ограничить свой запрос ...
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'
Также будет соответствовать десятичным знакам (например, -1.2, +0.2, 6., 2e9, 1.2e-10 ).
Тест:
drop table if exists myTable;
create table myTable (col1 varchar(50));
insert into myTable (col1)
values ('00.00'),('+1'),('.123'),('-.23e4'),('12.e-5'),('3.5e+6'),('a'),('e6'),('+e0');
select
col1,
col1 + 0 as casted,
col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$' as isNumeric
from myTable;
Результат:
col1 | casted | isNumeric
-------|---------|----------
00.00 | 0 | 1
+1 | 1 | 1
.123 | 0,123 | 1
-.23e4 | -2300 | 1
12.e-5 | 0,00012 | 1
3.5e+6 | 3500000 | 1
a | 0 | 0
e6 | 0 | 0
+e0 | 0 | 0
Попробуйте разделить / 1
select if(value/1>0 or value=0,'its a number', 'its not a number') from table
Еще одна альтернатива, которая кажется более быстрой, чем REGEXP на моем компьютере, -
SELECT * FROM myTable WHERE col1*0 != col1;
Это выберет все строки, где col1 начинается с числового значения.
AND col1<>0
, чтобы обработать это исключение.
– Urbycoz
3 November 2014 в 10:12
вы можете использовать
blockquote>CAST
SELECT * from tbl where col1 = concat(cast(col1 as decimal), "")
Вы также можете использовать регулярное выражение ... это будет выглядеть так:
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
WHERE col1 NOT REGEXP...
, а для случая, когда у вас может быть десятичная точка, используйте regex: ^[0-9\.]+$
– Robbie Averill
4 December 2013 в 01:44
001
– Rob Gale 20 October 2012 в 00:35