Симон Моурир дал этот пример :
object o = null;
DateTime d = (DateTime)o; // NullReferenceException
, где unboxing преобразование (литье) из object
(или из одного из классов System.ValueType
или System.Enum
или из типа интерфейса) - тип значения (кроме Nullable<>
) сам по себе дает NullReferenceException
.
В другом направлении конверсия бокса из a Nullable<>
, которая имеет HasValue
, равную false
, на ссылочный тип, может дать ссылку null
, которая затем может привести к NullReferenceException
. Классический пример:
DateTime? d = null;
var s = d.ToString(); // OK, no exception (no boxing), returns ""
var t = d.GetType(); // Bang! d is boxed, NullReferenceException
Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:
public static void MyExtension(this object x)
{
x.ToString();
}
следующий код будет проблематичным:
DateTime? d = null;
d.MyExtension(); // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.
Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<>
экземпляров.
Классическим способом было бы добавить запятые влево и вправо:
select * from shirts where CONCAT(',', colors, ',') like '%,1,%'
Но find_in_set также работает:
select * from shirts where find_in_set('1',colors) <> 0
Все ответы не совсем правильные, попробуйте следующее:
select * from shirts where 1 IN (colors);
Фактически вы должны исправить свою схему базы данных, чтобы у вас было три таблицы:
shirt: shirt_id, shirt_name
color: color_id, color_name
shirtcolor: shirt_id, color_id
Тогда, если вы хотите найти все рубашки, которые являются красными, вы сделали бы запрос типа:
SELECT *
FROM shirt, color
WHERE color.color_name = 'red'
AND shirt.shirt_id = shirtcolor.shirt_id
AND color.color_id = shirtcolor.color_id
select * from shirts where find_in_set('1',colors) <> 0
Работает для меня
Вы можете добиться этого, выполнив следующую функцию.
Запустите следующий запрос для создания функции.
DELIMITER ||
CREATE FUNCTION `TOTAL_OCCURANCE`(`commastring` TEXT, `findme` VARCHAR(255)) RETURNS int(11)
NO SQL
-- SANI: First param is for comma separated string and 2nd for string to find.
return ROUND (
(
LENGTH(commastring)
- LENGTH( REPLACE ( commastring, findme, "") )
) / LENGTH(findme)
);
И вызовите эту функцию следующим образом:
msyql> select TOTAL_OCCURANCE('A,B,C,A,D,X,B,AB', 'A');
Надеюсь, что это поможет.
Посмотрите на функцию FIND_IN_SET для MySQL.
SELECT *
FROM shirts
WHERE FIND_IN_SET('1',colors) > 0
Если вы используете MySQL, существует метод REGEXP, который вы можете использовать ...
http://dev.mysql.com/doc/refman/5.1/en/ regexp.html # operator_regexp
Итак, вы должны использовать:
SELECT * FROM `shirts` WHERE `colors` REGEXP '\b1\b'
Это будет работать наверняка, и я на самом деле попробовал это:
lwdba@localhost (DB test) :: DROP TABLE IF EXISTS shirts;
Query OK, 0 rows affected (0.08 sec)
lwdba@localhost (DB test) :: CREATE TABLE shirts
-> (<BR>
-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ticketnumber INT,
-> colors VARCHAR(30)
-> );<BR>
Query OK, 0 rows affected (0.19 sec)
lwdba@localhost (DB test) :: INSERT INTO shirts (ticketnumber,colors) VALUES
-> (32423,'1,2,5,12,15'),
-> (32424,'1,5,12,15,30'),
-> (32425,'2,5,11,15,28'),
-> (32426,'1,2,7,12,15'),
-> (32427,'2,4,8,12,15');
Query OK, 5 rows affected (0.06 sec)
Records: 5 Duplicates: 0 Warnings: 0
lwdba@localhost (DB test) :: SELECT * FROM shirts WHERE LOCATE(CONCAT(',', 1 ,','),CONCAT(',',colors,',')) > 0;
+----+--------------+--------------+
| id | ticketnumber | colors |
+----+--------------+--------------+
| 1 | 32423 | 1,2,5,12,15 |
| 2 | 32424 | 1,5,12,15,30 |
| 4 | 32426 | 1,2,7,12,15 |
+----+--------------+--------------+
3 rows in set (0.00 sec)
Попробуйте !!!
Если набор цветов более или менее фиксирован, наиболее эффективным и наиболее читаемым способом будет использование строковых констант в вашем приложении, а затем использование типа SET
MySQL [] в ваших запросах. При использовании типа SET
с FIND_IN_SET MySQL использует одно целое число для хранения всех значений и использует двоичную "and"
операцию для проверки наличия значений, которые являются более эффективными, чем сканирование разделенной запятыми строки .
В SET('red','blue','green')
, 'red'
будет храниться внутри 1
, 'blue'
будет храниться внутри, так как 2
и 'green'
будут храниться внутри 4
. Значение 'red,blue'
будет сохранено как 3
(1|2
) и 'red,green'
как 5
(1|4
).