1

指定された値が数値/整数または文字かどうかを確認するにはどうすればよいですか?

たとえば、これは私の作業中の SQL です。

SELECT 
    p.*

FROM page AS p

WHERE p.title = 'home'

AND IF(CONVERT('7', SIGNED INTEGER) IS NOT NULL, p.parent_id != p.page_id, p.parent_id = p.page_id)

' 7 ' は変数で、数値の場合もあれば、' self ' の場合もあります。

したがって、それが数値の場合、p.parent_id != p.page_id

そうしないとp.parent_id = p.page_id

しかし、私の SQL クエリは always を返すので、正しく理解できます p.parent_id != p.page_id

4

2 に答える 2

3

を使用できますREGEXP

AND CASE
    WHEN ('7' REGEXP '^[0-9]+$') THEN
      p.parent_id != p.page_id
    ELSE p.parent_id = p.page_id
END

期待どおりに動作しない理由CONVERT()は、数値以外の文字列が常に NULL ではなく 0 としてキャストされるためです。

mysql> SELECT CONVERT('7a', SIGNED INTEGER);
+-------------------------------+
| CONVERT('7a', SIGNED INTEGER) |
+-------------------------------+
|                             7 |
+-------------------------------+

mysql> SELECT CONVERT('self', SIGNED INTEGER);
+---------------------------------+
| CONVERT('self', SIGNED INTEGER) |
+---------------------------------+
|                               0 | <-- non-numeric strings always cast to 0
+---------------------------------+

NULL の代わりに 0 と比較すると、メソッドが機能する可能性がありますが、テストする良い方法がありません。ただし、値が実際に 0 の場合、これは失敗し、間違った比較が返されます。

AND IF(CONVERT('7', SIGNED INTEGER) <> 0, p.parent_id != p.page_id, p.parent_id = p.page_id)
于 2012-04-19T00:58:30.983 に答える
0

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

WHERE 
     '7' REGEXP '[[:digit:]]+' AND p.parent_id != p.page_id 
  OR '7' REGEXP '[[:alpha:]]+' AND p.parent_id = p.page_id

以上最適

WHERE 
     '7' REGEXP '[[:digit:]]+' AND p.parent_id != p.page_id 
  OR '7' = 'self'              AND p.parent_id = p.page_id

mysql による暗黙的なキャスト1を想定TRUE0ています。FALSE

于 2012-04-19T01:01:49.787 に答える