フィールドのデータ型を取得して判断したい

このQ&Aのポイント
  • syscolumnsから各フィールドごとのデータ型を取得し、数字項目か文字項目か判断させたい。
  • Where句で使うパラメータにフィールドが文字項目であれば自動的に'を付与する。
  • 日付(日時)を判断できる項目はあるか。
回答を見る
  • ベストアンサー

フィールドのデータ型を取得して判断したい

syscolumns から 各フィールドごとのデータ型を取得して「数字」項目か「文字」項目か判断させたいのです。 要は Where句で使うパラメータにフィールドが「文字」項目であれば自動的に「'」を付与するようにしたいのです。 下記のSelect文でscaleがNULLにも関わらずタイプに「文字」と入りません、どうしてでしょうか ---------------------------------------------------------------- select sc.name as フィールド名,sc.scale,case sc.scale when null then '文字' else '数字' end as タイプ from マスター管理_DB.dbo.sysobjects as so join マスター管理_DB.dbo.syscolumns as sc on so.id=sc.id join マスター管理_DB.dbo.systypes as st on sc.xtype=st.xtype where so.type='V' and left(so.name,2)='K_' and LEFT(st.name,3)<>'sys' ---------------------------------------------------------------- (フィールド名)  (scale)  (タイプ) 勘定科目コード   0     数字 勘定科目名    NULL   数字(←「文字」になってほしい) 貸借         NULL   数字(←「文字」になってほしい) 計科目名      NULL   数字(←「文字」になってほしい) ---------------------------------------------------------------- また、日付(日時)を判断できる項目はないでしょうか? よろしくお願いします。

  • SEsyo
  • お礼率78% (64/82)

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

・CASE文を以下の通り変更してください。 > case when sc.scale is null then '文字' else '数字' end as タイプ CASE xxx WHEN の書式の場合、条件は「=」とみなされます。 フィールド=NULLはANSI標準では常にFalseです。 ・また、おそらくこのままでは正しくでません。 (floatやrealが数字とみなされない) 私が書いたらこうするだろうというのを参考までに書きます。 なお、SQL Server 2008をお使いならば、sysobjects/syscolumnsでなく、sys.objects/sys.columnsを使った方がよいです。 SQL Server 2005のときから次バージョンではsysobjectsなどはサポートされない可能性があると言われていますので、 さすがに次のバージョンではなくなっているかもしれませんので。 select sc.name as フィールド名, case when type_name(sc.user_type_id)='timestamp' then 'その他' when type_name(sc.user_type_id) like '%date%' then '日付' when type_name(sc.user_type_id) like '%time%' then '日付' when sc.precision<>0 then '数字' when sc.collation_name is not null then '文字' else 'その他' end as タイプ from sys.objects as so inner join sys.columns as sc on so.object_id=sc.object_id where so.type='V' and left(so.name,2)='K_' ・日付を判断する項目はなく、上記の通り判別するしかなさそうです。  ただ、date,time,smalldatetime,datetime,datetime2,datetimeoffsetと全部拾えるでしょう。

SEsyo
質問者

お礼

「私が書いたらこうするだろうというの」をそのままいただきました。 内容は時間を書けて分析します。 ありがとうございました、これでゆっくり寝られます。

関連するQ&A

  • ACCESSのフィールドデータの照合について

    テーブルAのフィールドAとテーブルBのフィールドBの文字をAを基準に1文字づつ全文字を照合しアンマッチ文字が3文字以上発生したら-1を1及び2文字発生は1を全て照合OKなら数字の0をクエリで行いたいのですが・・・ 最大21文字照合となります。 テーブルBのデータは手書文字をOCR変換した物でACCESS2000のマスターデータと照合しています。

  • Access :ALTER TABLE で作成した文字列フィールドがトリミングされない

    いつもお世話になっております。 Access2000を使用しております。 Accessで作成した、あるシステムのバージョンアップを行っております。 その際、複数のテーブルにフィールドを追加する移行プログラムを作成しております。 Dim DB As DAO.Database Set DB = OpenDatabase("外部DB.MDB") DB.Execute ("ALTER TABLE 既存テーブル ADD 追加フィールド CHAR(255)") DB.Close 'データベースを閉じる Set DB = Nothing 上記のようなプログラムを走らせたのですが、 作成された追加フィールドにデータを入力すると、 入力した値の後に指定サイズ分の空白文字ができてしまいます。 つまり、10文字入力した場合 255-10=245文字が空白として登録されてしまいます。 Unicode圧縮プロパティのせいかな、と思い、 Dim TBL As DAO.TableDef Dim FLD As DAO.Field Dim prUC As DAO.Property Set TBL = DB.TableDefs("既存テーブル") Set FLD = TBL.Fields("追加フィールド") Set prUC = FLD.Properties("UnicodeCompression") prUC.Value = True と、フィールド追加後にプロパティを変更してみたりもしたのですが、 やはり、空白が出てしまいます。 作成したフィールドの空白文字がセットされないようにするにはどのようなことを行えばよいのでしょうか。 ご教授のほど、宜しくお願い致します。

  • BitフィールドにLOAD DATAできない

    以下の定義のテーブル(Bitフィールドを持つ)にLOAD DATAでデータを 入れようとしているのですがエラーになり困っています。 マニュアルにあるようにSET句を使用してLOADをしようとしているのですが 「You have an error in your SQL syntax;~」と コマンドの4行目のところで出てしまいます。どこがおかしいのでしょうか。 【テーブルの定義】 mysql> desc data; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | key1 | int(11) | NO | PRI | NULL | | | key2 | int(11) | NO | PRI | NULL | | | date | datetime | NO | PRI | NULL | | | flg1 | bit(1) | NO | | b'1' | | +-------+----------+------+-----+---------+-------+ 【CSVファイルの内容】 1,2,"2016-12-17 10:00:00",1 1,2,"2016-12-17 11:00:00",0 【コマンド】 LOAD DATA INFILE 'C:/csv/data.csv' INTO TABLE test.data (key1, key2, date, @var1) SET flg1 = CAST(@var1 AS SIGNED) FIELDS TERMINATED BY ',' ENCLOSED BY '"';

  • 移植性のあるSQLの書き方

    現在Oracleを使用していますが、 将来他のDBに切り替える可能性もある、ということで、 移植性のあるSQLを書こうとしているのですが・・・ ある文字列フィールドの値がNULLか空文字列の場合、 という判定式で困っています。 普通のDBだと、   field IS NULL OR field <> '' と書くところですが、 Oracleの場合、空文字列=NULLなので、 上記の書き方をすると、field <> NULL という式が成り立たず、 常に偽になってしまいます。 移植性があり、且つ、パフォーマンス的にも問題のない、 なにかよい書き方ないでしょうか。。??

  • 同じテーブルのフィールドを使ったUPDATEしたい

    こんにちは。 いつも参考にさせていただいています。 本日は投稿側です。 やりたいことは「T_ALL」テーブルの加工した「受付番号」フィールドを 「お客様番号」フィールドに書き込むことです。 ACCESS VBAで以下のコードを書き、実行すると[受付番号]のとこで 「定義されていない」とエラーになります。 思考錯誤しましたが解決できず困っています。 ご教示ください。 よろしくお願いします。 ************************************************************************* Dim db As ADODB.Connection Dim rs As ADODB.Recordset Dim mypath, we As String Dim mysql As String Set db = New ADODB.Connection Set rs = New ADODB.Recordset db.Open "Provider=OraOLEDB.Oracle;Data Source=kcwf;User Id=kcwf;Password=kcwf;" rs.Open "SELECT * FROM T_ALL", db, adOpenDynamic, adLockOptimistic, adCmdText '***** 項目を更新 mysql = "UPDATE T_ALL SET お客様番号= 'B" & Mid([受付番号], 5, 9) & "'" db.Execute mysql 'Close rs.Close Set rs = Nothing db.Close Set db = Nothing *************************************************************************

  • 移植性のあるSQLの書き方(改)

    先に質問内容を書き間違えてしまいましたので、 改めて・・・ 現在Oracleを使用していますが、 将来他のDBに切り替える可能性もある、ということで、 移植性のあるSQLを書こうとしているのですが・・・ ある文字列フィールドの値がNULLか空文字列の場合を除く、 という判定式で困っています。 普通のDBだと、   field IS NOT NULL AND field <> '' と書くところですが、 Oracleの場合、空文字列=NULLなので、 上記の書き方をすると、field <> NULL という式が成り立たず、 常に偽になってしまいます。 空文字列との比較が常に成り立たないなら、   NOT ( field IS NULL OR field = '' ) では・・・と思ったのですが、これでもダメです。 空文字列と比較する部分があると、 式全体が常に偽になってしまうようです。 移植性があり、且つ、パフォーマンス的にも問題のない、 なにかよい書き方ないでしょうか。。??

  • テーブルデータの並び替えについて。

    テーブルデータの並び替えについて。 環境:ACCESS2000 状況:テーブル2つ(マスターテーブル、マスターコピー)    メインフォーム上にサブフォームを置き、マスターコピーのデータを    表示させているのですが、そこで並び替えをする予定。    マスターテーブルのフィールド     種類  /  サイズ  /  商品名    ※マスターコピーも同様(マスターテーブルを全てコピーのため) 現在のコード: Dim db As Database Set db = CurrentDb db.Execute "DELETE * FROM マスターコピー" db.Execute "INSERT INTO マスターコピー SELECT * FROM マスターテーブル" SELECT 種類, サイズ, 商品名 FROM マスターコピー ORDER BY 種類, サイズ ←ここでエラー エラー内容・・・構文エラー まだACCESS未熟のため完全には理解できておらず ネット検索等で調べてコードを組んでいるため 何が間違っているのかわからず、ご質問させて頂きました。 お手数お掛けしますが、何卒ご教授の程宜しくお願い致します。

  • 項目が一致したフィールドを追加

    インポートしたデータを項目名が一致したフィールドを作業テーブルに追加クエリしたい。 ご回答ありがとうございます。是非教えてください。 ・インポートは先頭行をフィールド名として使ってません。 項目名_PP(20個)にある項目名とインポートした一時テーブルにある項目と一致したフィールドを作業テーブルに追加したいのですが取得した20フィールドを作業テーブルに追加をどうやっていいかわかりません。 作業テーブルも20項目あるのですが・・ご教授お願いします。 Set db = CurrentDb() Dim rs As DAO.Recordset Dim rstop As DAO.Recordset Dim SQL As String Dim SQLTop As String Dim iCntTop As Integer Dim sERRTXT As String Dim bFlg As Boolean Dim sSQLNM As String SQL = "項目名_PP" SQLTop = "一時テーブル" If F_RecordsetOpen(SQLTop, rstop, dbOpenSnapshot, dbReadOnly) Then If F_RecordsetOpen(SQL, rs, dbOpenSnapshot, dbReadOnly) Then Do Until rs.EOF For iCntTop = 0 To 254 sSQLNM = "" '項目名が一致したら(=必要項目)ループを抜ける If rstop.Fields(iCntTop) = rs![項目名] Then sSQLNM = rstop.Fields(iCntTop).Name Debug.Print sSQLNM Exit For End If Next iCntTop If Trim(sSQLNM) <> "" Then ' SQL = " INSERT INTO 作業テーブル ' 'sSQLNMでループで抜けたフィールドを追加作業テーブルに追加したいのですが・・・ Call F_ExecuteSQL(SQL) End If rs.MoveNext Loop End If Call S_RecordsetClose(rs) End If Call S_RecordsetClose(rstop) End Sub

  • 「FileMaker ver6」にて、フィールドの文字数の制限?

    「FileMaker ver6」にて、フィールドに文字を入力した際に表示の文字が化けるという現象がでました。  こんな感じです。「0129471 0129470」と入力したら「1.2947E+12」と表示されました。もう一度、入力しようとフィールドを選択すると正しい数字が表示され離すとまた化けるといった内容です。  実際のフィールドです。   ●タイプ………………数字   ●オプション…………ユニークな値   ●索引…………………オン   ●フィールドサイズ…「160pxX18px」   ●書体…………………「MS P明朝」14pt   ●スタイル……………標準のみ                    以上

  • データの追加、更新について

    現在、PHPとMySQLにて、会員登録のシステムを構築しています。 初歩的なことかとは存じますが、以下のような場合どのような形にするのが良いのかアドバイスいただけますでしょうか。 データベースのテーブルのフィールドに、 メールアドレス登録用のフィールドがあり、 デフォルトはNULLとしています。 メールアドレス自体は任意の入力項目となっており、 空の場合もあります。 入力が空の場合は、データ追加あるは更新の際、 メールアドレスのフィールドには空文字を入れるのが良いのでしょうか。あるいは「NULL」としておく方が良いのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • MySQL